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.复制的:)