0

私の目的は、カメラからキャプチャされた画像のパターンを見つけるcv::matchShapesことです。これを実装するためのopencvの方法を見つけました。

このメソッドを実装すると、matchShapes メソッドでアプリがクラッシュします。何か間違ったことをした可能性があります:-

クエリ画像で一致する形状を見つけるためにこのメソッドを使用する方法が正確にわかりません。これが私が試したことです。

これが私のコードです:-

    - (void)tryingMatchShapes:(cv::Mat)_image _image1:(cv::Mat)_image1
    {
        std::vector<std::vector<cv::Point> > squares;

        cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
        int thresh = 50, N = 11;
        cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2));
        cv::pyrUp(pyr, timg, _image.size());
        std::vector<std::vector<cv::Point> > contours;
        for( int c = 0; c < 3; c++ ) {
            int ch[] = {c, 0};
            mixChannels(&timg, 1, &gray0, 1, ch, 1);
            for( int l = 0; l < N; l++ ) {
                if( l == 0 ) {
                    cv::Canny(gray0, gray, 0, thresh, 5);
                    cv::dilate(gray, gray, cv::Mat(), cv::Point(-1,-1));
                }
                else {
                    gray = gray0 >= (l+1)*255/N;
                }
                cv::findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

            }
        }
                cv::Mat pyr1, timg1, gray2(_image1.size(), CV_8U), gray1;
                cv::pyrDown(_image1, pyr1, cv::Size(_image1.cols/2, _image1.rows/2));
                cv::pyrUp(pyr1, timg1, _image1.size());
                std::vector<std::vector<cv::Point> > contours1;
                for( int c = 0; c < 3; c++ ) {
                    int ch[] = {c, 0};
                    mixChannels(&timg1, 1, &gray2, 1, ch, 1);
                    for( int l = 0; l < N; l++ ) {
                        if( l == 0 ) {
                            cv::Canny(gray2, gray1, 0, thresh, 5);
                            cv::dilate(gray1, gray1, cv::Mat(), cv::Point(-1,-1));
                        }
                        else {
                            gray1 = gray2 >= (l+1)*255/N;
                        }
                        cv::findContours(gray1, contours1, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);



                    }
                }
for( size_t i = 0; i < contours.size(); i++ )
    {
  double value=  cv::matchShapes(contours[i], contours1[i], CV_CONTOURS_MATCH_I1, 0);
        NSLog(@"%f",value);

    }     
    }


    UIImage *testImage = [UIImage imageNamed:@"note_with_marks (1).png"];    
    [self.imageView setImage:testImage];
    cv::Mat forground = [testImage CVMat]; 
    UIImage *testImage2 = [UIImage imageNamed:@"1.png"];    
    cv::Mat forground2 = [testImage2 CVMat];
    [self tryingMatchShapes:forground _image1:forground2];

The app is getting crashed.

Error:-

  OpenCV Error: Assertion failed (contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth()) in matchShapes, file /Users/Aziz/Documents/Projects/opencv_sources/trunk/modules/imgproc/src/contours.cpp, line 1705

コーディングの観点から、このメソッドの実装を手伝ってください。コーディングの助けが必要です.私はすでに多くの理論的概念を経験しています.

前もって感謝します!

4

1 に答える 1

2
std::vector<std::vector<cv::Point> > contours1;

matchShapesそのようなタイプには適用できません。等高線のグループ (配列) ではなく、各 (1 つの) 等高線に適用できます。例えば:

cv::matchShapes(contours[0], contours1[0], CV_CONTOURS_MATCH_I1, 0);
于 2012-08-27T13:41:47.913 に答える