- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我仍在研究 last program虽然我终于找到了解决问题的方法(关于如何过滤最大轮廓),但我现在有一个新问题,或者更确切地说是一个问题。
如您所见,我正在使用 Canny 算法搜索视频中的边缘。但是我将用于检测的物体没有特定的颜色,所以当物体的颜色与周围的颜色大致相同时(例如,如果物体是银色而背景是白色),物体的边缘就会消失,我无法得到物体的轮廓。
现在我将测试 OpenCV 中可用的每一种边缘过滤算法,但为了缩短我的工作时间,我需要你的帮助来推荐最好(或至少更好)的算法而不是 canny。现在我测试了 Sobel,但结果并不比 canny 的好。如果可能,请将我链接到一些好的示例以供引用。
代码:
int main( int argc, char** argv )
{
CvCapture *cam;
CvMoments moments;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours = NULL;
CvSeq* contours2 = NULL;
CvPoint2D32f center;
int i;
cam=cvCaptureFromCAM(0);
if(cam==NULL){
fprintf(stderr,"Cannot find any camera. \n");
return -1;
}
while(1){
IplImage *img=cvQueryFrame(cam);
if(img==NULL){return -1;}
IplImage *src_gray= cvCreateImage( cvSize(img->width,img->height), 8, 1);
cvCvtColor( img, src_gray, CV_BGR2GRAY );
cvSmooth( src_gray, src_gray, CV_GAUSSIAN, 5, 11);
cvCanny(src_gray, src_gray, 70, 200, 3);
cvFindContours( src_gray, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
if(contours==NULL){ contours=contours2;}
contours2=contours;
CvSeq* current_contour = contours;
double largestArea = 0;
CvSeq* largest_contour = NULL;
while (current_contour != NULL){
double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));
if(area > largestArea){
largestArea = area;
largest_contour = current_contour;
}
current_contour = current_contour->h_next;
}
cvMoments(largest_contour, &moments, 1);
double m_00 = cvGetSpatialMoment( &moments, 0, 0 );
double m_10 = cvGetSpatialMoment( &moments, 1, 0 );
double m_01 = cvGetSpatialMoment( &moments, 0, 1 );
float gravityX = (m_10 / m_00)-150;
float gravityY = (m_01 / m_00)-150;
if(gravityY>=0&&gravityX>=0&&m_00>=3000){
printf("center point=(%.f, %.f), Area = %.f \n",gravityX,gravityY,m_00); }
if(m_00>=3000){
CvScalar color = CV_RGB(250,0,0);
cvDrawContours(img,largest_contour,color,color,-1,-1, 8, cvPoint(0,0));
}
cvShowImage( "Input", img );
cvShowImage( "Contours", src_gray );
cvClearMemStorage(storage);
if(cvWaitKey(33)>=0) break;
}
cvDestroyWindow("Contours");
cvDestroyWindow("Source");
cvReleaseCapture(&cam);
}
...最后,等待已久的示例图片:
首先是好的(我的黑钱包)
二、失败(橙色框)
最后,另一个失败(白框)
附言,一些注意事项:
提前致谢。干杯
最佳答案
您的问题不是边缘检测算法。您的问题是您正在对算法参数进行硬编码,并期望它能神奇地适用于您扔给它的所有图像。此外,在使用 cvCanny
之前平滑图像是不必要的,因为 Canny 运算符已经为您执行了平滑。
由于您现在想要实现的目标更加清晰,我可以提出一个建议:处理视频而不是单独查看每一帧。如果相机是固定的,而拿着物体的手在移动,那么通过 background subtraction 检测形状就很简单了。 .如果相机不固定,你仍然可以detect the hand (PDF 链接)并从那里开始工作。此外,使用您可能拥有的任何其他特定于应用程序的知识(例如,项目将在屏幕中间,手将在项目下方)。
关于c++ - 视频节目中更好的边缘滤波算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971093/
基本上,我已经用 Python 为 www.thetvdb.com 编写了一个 API。当前代码可以找到here . 它根据请求从 API 获取数据,并且必须以某种方式存储数据,并通过以下方式使其可用
我真的是 JS 的新手,无法理解 Vimeo 上的这些事件监听器。基本上我需要一个 div,在视频下方,在视频播放时隐藏,并在视频结束时出现。请帮忙,因为我不知道从哪里开始。我什么都试过了。 这是我目
有没有办法使用 Espresso 测试 snackbar 是否显示正确的文本? 我有一个简单的调用来创建一个 snackbar Snackbar.make(mView, "My text", Snac
我是一名优秀的程序员,十分优秀!