Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
C++ 基于opencv的Logo检测_C++_Opencv - Fatal编程技术网

C++ 基于opencv的Logo检测

C++ 基于opencv的Logo检测,c++,opencv,C++,Opencv,我试图在一些样本中检测到一个品牌标志,但我无法得到任何有用的结果。使用cvBlobs我找到了所有相关的红色图像区域,没有任何问题,但现在我必须了解哪些区域有ULKER徽标。我想到了一个简单的冲浪。将完成工作(通过查看其他类似项目的成功案例) 但结果远远不好。此外,我还尝试在任何处理之前应用cvCanny,以获得徽标的边缘表示并删除背景,但没有区别。你能帮帮我,告诉我我做错了什么吗? ,以及守则 int find(IplImage* image, IplImage* object) { C

我试图在一些样本中检测到一个品牌标志,但我无法得到任何有用的结果。使用
cvBlobs
我找到了所有相关的红色图像区域,没有任何问题,但现在我必须了解哪些区域有ULKER徽标。我想到了一个简单的冲浪。将完成工作(通过查看其他类似项目的成功案例) 但结果远远不好。此外,我还尝试在任何处理之前应用
cvCanny
,以获得徽标的边缘表示并删除背景,但没有区别。你能帮帮我,告诉我我做错了什么吗? ,以及守则

int find(IplImage* image, IplImage* object)
{
    CvMemStorage* storage = cvCreateMemStorage(0);

    cvNamedWindow("Object", 1);
    cvNamedWindow("Object Correspond", 1);

    static CvScalar colors[] =
    {
            {{0,0,255}},
            {{0,128,255}},
            {{0,255,255}},
            {{0,255,0}},
            {{255,128,0}},
            {{255,255,0}},
            {{255,0,0}},
            {{255,0,255}},
            {{255,255,255}}
    };

    CvSeq* objectKeypoints = 0, *objectDescriptors = 0;
    CvSeq* imageKeypoints = 0, *imageDescriptors = 0;
    int i;
    CvSURFParams params = cvSURFParams(100, 0);

    IplImage *objectGray = cvCreateImage(cvSize(object->width, object->height), object->depth,1);
    IplImage *objectSobel = cvCreateImage(cvSize(object->width, object->height), IPL_DEPTH_16S,1);
    cvCvtColor( object, objectGray, CV_BGR2GRAY );

    cvCanny(objectGray,objectGray,50,20,3);
    //cvConvertScale(objectSobel,objectGray);

    IplImage *imageGray = cvCreateImage(cvSize(image->width, image->height), image->depth,1);
    IplImage *imageSobel = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_16S,1);
    cvCvtColor( image, imageGray, CV_BGR2GRAY );
    cvCanny(imageGray,imageGray,50,10,3);
    //cvSobel(imageGray,imageSobel,dx,dy,ks);
    //cvConvertScale(imageSobel,imageGray);

    double tt = (double)cvGetTickCount();
    cvExtractSURF( objectGray, 0, &objectKeypoints, &objectDescriptors, storage, params ,0);

    printf("Object Descriptors: %d\n", objectDescriptors->total);
    printf("Object Keypoints: %d\n", objectKeypoints->total);

    cvExtractSURF( imageGray, 0, &imageKeypoints, &imageDescriptors, storage, params ,0);
    printf("Image Descriptors: %d\n", imageDescriptors->total);
    printf("Image Keypoints: %d\n", imageKeypoints->total);
    tt = (double)cvGetTickCount() - tt;

    printf( "Extraction time = %gms\n", tt/(cvGetTickFrequency()*1000.));

    CvPoint src_corners[4] = {{0,0}, {objectGray->width,0}, {objectGray->width, objectGray->height}, {0, objectGray->height}};
    CvPoint dst_corners[4];     

    if( locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints,
            imageDescriptors, src_corners, dst_corners ))
    {
        for( i = 0; i < 4; i++ )
        {
            CvPoint r1 = dst_corners[i%4];
            CvPoint r2 = dst_corners[(i+1)%4];
            cvLine( image, cvPoint(r1.x, r1.y ),
                    cvPoint(r2.x, r2.y ), colors[6] );
        }
    }
    vector<int> ptpairs;

    flannFindPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs );
    for( i = 0; i < (int)ptpairs.size(); i += 2 )
    {
        CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i] );
        CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i+1] );
        CvPoint center;
        int radius;
        center.x = cvRound(r2->pt.x);
        center.y = cvRound(r2->pt.y);
        radius = cvRound(r2->size*1.2/9.*2);
        cvCircle( image, center, radius, colors[0], 1, 8, 6 );
    }


    cvShowImage( "Object Correspond", image );
    cvMoveWindow( "Object Correspond",400,400);
    for( i = 0; i < objectKeypoints->total; i++ )
    {
        CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, i );
        CvPoint center;
        int radius;
        center.x = cvRound(r->pt.x);
        center.y = cvRound(r->pt.y);
        radius = cvRound(r->size*1.2/9.*2);
        cvCircle( object, center, radius, colors[0], 1, 8, 6 );
    }
    cvShowImage( "Object", object );   
    cvWaitKey(0);

    cvDestroyWindow("Object");
    cvDestroyWindow("Object Correspond");
    return 0;
}
int find(IplImage*图像,IplImage*对象)
{
CvMemStorage*storage=cvCreateMemStorage(0);
cvNamedWindow(“对象”,1);
cvNamedWindow(“对象对应”,1);
静态标量颜色[]=
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}},
{{255,255,255}}
};
CvSeq*objectKeypoints=0,*objectDescriptors=0;
CvSeq*imageKeypoints=0,*imageDescriptors=0;
int i;
CvSURFParams params=CvSURFParams(100,0);
IplImage*objectGray=cvCreateImage(cvSize(对象->宽度,对象->高度),对象->深度,1);
IplImage*objectSobel=cvCreateImage(cvSize(对象->宽度,对象->高度),IPL_深度_16S,1);
CVT颜色(对象、对象灰色、CV_bgr2灰色);
cvCanny(objectGray,objectGray,50,20,3);
//CVS刻度(objectSobel、objectGray);
IplImage*imageGray=cvCreateImage(cvSize(图像->宽度,图像->高度),图像->深度,1);
IplImage*imageSobel=cvCreateImage(cvSize(图像->宽度,图像->高度),IPL_深度_16S,1);
CVT颜色(图像、图像灰度、CV_bgr2灰度);
cvCanny(imageGray,imageGray,50,10,3);
//cvSobel(imageGray、imageSobel、dx、dy、ks);
//CVD转换标度(imageSobel、imageGray);
双tt=(双)cvGetTickCount();
cvExtractSURF(objectGray,0,&objectKeypoints,&ObjectDescriptor,storage,params,0);
printf(“对象描述符:%d\n”,对象描述符->总计);
printf(“对象关键点:%d\n”,对象关键点->总计);
cvExtractSURF(imageGray,0,&imageKeypoints,&ImageDescriptor,存储器,参数,0);
printf(“图像描述符:%d\n”,图像描述符->总计);
printf(“图像关键点:%d\n”,图像关键点->总计);
tt=(双)cvGetTickCount()-tt;
printf(“提取时间=%gms\n”,tt/(cvGetTickFrequency()*1000.);
CvPoint src_corners[4]={{0,0},{objectGray->width,0},{objectGray->width,objectGray->height},{0,objectGray->height};
CvPoint dst_角[4];
如果(LocatePlanaObject)(对象关键点、对象描述符、图像关键点、,
图像描述符、src_角、dst_角)
{
对于(i=0;i<4;i++)
{
CVR1点=dst_角[i%4];
Cv点r2=dst_角[(i+1)%4];
cvLine(图像,cvPoint(r1.x,r1.y),
cvPoint(r2.x,r2.y),颜色[6];
}
}
向量对;
法兰索引对(objectKeypoints、ObjectDescriptor、imageKeypoints、ImageDescriptor、ptpairs);
对于(i=0;i<(int)ptpairs.size();i+=2)
{
CvSURFPoint*r1=(CvSURFPoint*)CVGetSekelem(objectKeypoints,ptpairs[i]);
CvSURFPoint*r2=(CvSURFPoint*)cvGetSeqElem(imageKeypoints,ptpairs[i+1]);
中心点;
整数半径;
中心x=cvRound(r2->pt.x);
中心y=cvRound(r2->pt.y);
半径=cvRound(r2->尺寸*1.2/9.*2);
cvCircle(图像、中心、半径、颜色[0]、1、8、6);
}
cvShowImage(“对象对应”,图像);
cvMoveWindow(“对象对应”,400400);
对于(i=0;itotal;i++)
{
CvSURFPoint*r=(CvSURFPoint*)cvGetSeqElem(objectKeypoints,i);
中心点;
整数半径;
中心x=cvRound(r->pt.x);
中心y=cvRound(r->pt.y);
半径=cvRound(r->尺寸*1.2/9.*2);
cvCircle(对象、中心、半径、颜色[0]、1、8、6);
}
cvShowImage(“对象”,对象);
cvWaitKey(0);
CVD窗口(“对象”);
CVD窗口(“对象对应”);
返回0;
}

我可能会过度使用它,但在这种情况下,我必须推荐模板匹配。问题是我的模板(徽标)大小大多大于样本。我也知道旋转和缩放对我来说是个问题。正如你们所看到的,货架上的产品并不总是摆放得很好。若商标更大,那个就缩小它的尺寸。您是否尝试过查找OpenCV样本附带的_obj.c样本?是否查看了样本图像。这不是一个单一的问题。我要走的路是金字塔,冲浪就是这样。是的,我主要是从find_obj.c.复制的:)我可能会过度使用它,但在这种情况下,我必须推荐模板匹配。问题是我的模板(徽标)大小大多大于样本。我也知道旋转和缩放对我来说是个问题。正如你们所看到的,货架上的产品并不总是摆放得很好。若商标更大,那个就缩小它的尺寸。您是否尝试过查找OpenCV样本附带的_obj.c样本?是否查看了样本图像。这不是一个单一的问题。我要走的路是金字塔,冲浪就是这样。是的,我主要是从find_obj.c.复制的:)