Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone cv::matchShapes方法实现给出错误_Iphone_Objective C_Image Processing_Opencv - Fatal编程技术网

Iphone cv::matchShapes方法实现给出错误

Iphone cv::matchShapes方法实现给出错误,iphone,objective-c,image-processing,opencv,Iphone,Objective C,Image Processing,Opencv,我的目标是找到从相机捕获的图像中的模式。为此,我找到了opencv的cv::matchShapes方法来实现它 当我实现此方法时,它使应用程序在matchShapes方法上崩溃。可能是我做错了什么:- 我确实不知道如何使用这种方法在我的查询图像中找到匹配形状。这就是我尝试的 这是我的密码:- - (void)tryingMatchShapes:(cv::Mat)_image _image1:(cv::Mat)_image1 { std::vector<std

我的目标是找到从相机捕获的图像中的模式。为此,我找到了opencv的
cv::matchShapes
方法来实现它

当我实现此方法时,它使应用程序在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
-(无效)尝试匹配形状:(cv::Mat)\u图像\u图像1:(cv::Mat)\u图像1
{
向量平方;
cv::Mat pyr,timg,灰色0(_image.size(),cv_8U),灰色;
int thresh=50,N=11;
cv::pyrDown(_image,pyr,cv::Size(_image.cols/2,_image.rows/2));
cv::pyrUp(pyr,timg,_image.size());
矢量轮廓;
对于(int C=0;C<3;C++){
int ch[]={c,0};
混音通道(&timg,1,&0,1,ch,1);
对于(int l=0;l=(l+1)*255/N;
}
cv::findContours(灰色、等高线、等高线列表、等高线链近似简单);
}
}
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::矢量轮廓图1;
对于(int C=0;C<3;C++){
int ch[]={c,0};
混音通道(&timg1,1,&gray2,1,ch,1);
对于(int l=0;l=(l+1)*255/N;
}
cv::findContours(灰色1,轮廓1,轮廓列表,轮廓链近似简单);
}
}
对于(size_t i=0;i=0&&contour2.checkVector(2)>=0&&contour1.depth()==CV||contour1.depth()==CV|U 32S)&&contour1.depth()==contour2.depth())在matchShapes、file/Users/Aziz/Documents/Projects/OpenCV|sources/trunk/modules/imgproc/src/contours.cps,第1705行中
请一些机构从编码的角度帮助我实现这个方法。 我需要一些编码帮助。我已经学习了很多理论概念


提前谢谢

谢谢你的回答。你能发布更多的代码吗?我应该如何正确地实现它。我尝试用你的答案重新绘制它,但它给出了错误:-在这个std::vector中没有名为get的成员contours@Gypsa抱歉,
get()
是java方法。当然我的意思是
[]
。请立即查看答案。谢谢您能否帮助我正确实现此代码。现在错误已被删除,但仍然没有结果。@Gypsa我的答案包含所有需要的信息-您可以将一个(而不是两个、三个或更多)轮廓与另一个匹配。但是
findContours
返回图像上的所有轮廓,所以不能将
matchShapes
与此类参数一起使用。你明白吗?
std::vector<std::vector<cv::Point> > contours1;
cv::matchShapes(contours[0], contours1[0], CV_CONTOURS_MATCH_I1, 0);