2016-12-30 16 views
2

私はこのイメージがあります enter image description hereOpenCVの拡張およびスケルトン(C++)

をそして、私はこのコードで拡張を適用:

int dilation_elem = 0; 
int dilation_size = 0; 
int const max_elem = 2; 
int const max_kernel_size = 21; 


void Dilation(int, void*); 

int main(int argc, char** argv) 
{ 

    src = imread("a18.png"); 

    if(!src.data) 
    { return -1; } 

    namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("Dilation Demo", src.cols, 0); 

    createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo", 
        &dilation_elem, max_elem, 
        Dilation); 

    createTrackbar("Kernel size:\n 2n +1", "Dilation Demo", 
        &dilation_size, max_kernel_size, 
        Dilation); 
//int dilation_size =7; 
    /// Default start 

    Dilation(0, 0); 

    waitKey(0); 
    return 0; 
} 

void Dilation(int, void*) 
{ 
    int dilation_type; 
    if(dilation_elem == 0){ dilation_type = MORPH_RECT; } 
    else if(dilation_elem == 1){ dilation_type = MORPH_CROSS; } 
    else if(dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; } 

    Mat element = getStructuringElement(dilation_type, 
             Size(2*dilation_size + 1, 2*dilation_size+1), 
             Point(dilation_size, dilation_size)); 

    dilate(src, dilation_dst, element); 
    imshow("Dilation Demo", dilation_dst); 
    imwrite("a18d.png",dilation_dst); 
} 

そして、このステップの後、私はこの後件を得る: enter image description here

最後のステップはスケルトンです:

#include <iostream> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
int main() 
{ 
    cv::Mat img = cv::imread("a18d.png", 0); 
cv::threshold(img, img, 127, 255, cv::THRESH_BINARY); 
cv::Mat skel(img.size(), CV_8UC1, cv::Scalar(0)); 
cv::Mat temp; 
cv::Mat eroded; 

cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3,3)); 

bool done;  
do 
{ 
    cv::erode(img, eroded, element); 
    cv::dilate(eroded, temp, element); // temp = open(img) 
    cv::subtract(img, temp, temp); 
    cv::bitwise_or(skel, temp, skel); 
    eroded.copyTo(img); 

    done = (cv::countNonZero(img) == 0); 
} while (!done); 
cv::imshow("Skeleton", skel); 
cv::imwrite("18s.png",skel); 
cv::waitKey(0); 

    return 0; 
} 
ここ

コード

そして、私はこのイメージHVE: enter image description here

をしかし、私はこのようなイメージをしたい: enter image description here

私はこのために何ができますか?問題は何ですか? これらの手順は画像4で実行され、結果は良好です

+0

スケルトンコードを記入してください。現在、拡張コードは2回コピーされているため、速くは取得できません。 –

+0

あなたはスケルトンコードのためにもここで確認できます。http://stackoverflow.com/questions/22058485/how-to-implement-an-function-equivalent-to-bwmorph-matlab-function-in-opencv/22060992#22060992 –

+0

ありがとう、実際にあなたの方法は良いです私の新しい結果はここにありますhttp://i.resimyukle.xyz/cyNL.pngしかし、画像はこの問題のためのアドバイスを超過しています –

答えて

関連する問題