c++ - 什么是opencv中的V4L/AVLD?

标签 c++ opencv detection geometry

我遵循此页面中的说明:http://wiki.elphel.com/index.php?title=OpenCV_Tennis_balls_recognizing_tutorial 检测网球。此代码可以针对 Python 运行,它的要求是 V4L/AVLD 用于形态学操作。它使用函数 cvClose()cvOpen() 来膨胀和腐 eclipse 掩模。我用 c++ 编写代码,因此使用了 cvDilate()cvErode(),但结果不如那个网站好。

这是我的结果:output.jpg . (对不起,因为我没有足够的声誉来发布图像T_T) 这是我的完整代码:

#include "highgui.h"
#include "cv.h"
void main()
{
    IplImage* img = cvLoadImage("tennis.jpg",1);
    CvSize size = cvGetSize(img);
    IplImage *hsv = cvCreateImage(size, IPL_DEPTH_8U, 3);
    cvCvtColor(img, hsv, CV_BGR2HSV);
    CvMat *mask = cvCreateMat(size.height, size.width, CV_8UC1);
    cvInRangeS(hsv, cvScalar(0.11*256, 0.60*256, 0.20*256, 0),
                    cvScalar(0.14*256, 1.00*256, 1.00*256, 0), mask);
    cvReleaseImage(&hsv);
    IplConvKernel *se21 = cvCreateStructuringElementEx(21, 21, 10, 10, CV_SHAPE_RECT, NULL);
    IplConvKernel *se11 = cvCreateStructuringElementEx(11, 11, 5,  5,  CV_SHAPE_RECT, NULL);
    cvErode(mask, mask, se21); 
    cvDilate(mask, mask, se11);   
    cvReleaseStructuringElement(&se21);
    cvReleaseStructuringElement(&se11);

    /* Copy mask into a grayscale image */
    IplImage *hough_in = cvCreateImage(size, 8, 1);
    cvCopy(mask, hough_in, NULL);
    cvSmooth(hough_in, hough_in, CV_GAUSSIAN, 15, 15, 0, 0);

    /* Run the Hough function */
    CvMemStorage *storage = cvCreateMemStorage(0);
    CvSeq *circles = cvHoughCircles(hough_in, storage,CV_HOUGH_GRADIENT, 4, size.height/10, 100, 40, 0, 0);
    cvReleaseMemStorage(&storage);
    int i;
    for (i = 0; i < circles->total; i++) {
         float *p = (float*)cvGetSeqElem(circles, i);
         CvPoint center = cvPoint(cvRound(p[0]),cvRound(p[1]));
         CvScalar val = cvGet2D(mask, center.y, center.x);
         if (val.val[0] < 1) continue;
             cvCircle(img,  center, 3,             CV_RGB(0,255,0), -1, CV_AA, 0);
             cvCircle(img,  center, cvRound(p[2]), CV_RGB(255,0,0),  3, CV_AA, 0);
             cvCircle(mask, center, 3,             CV_RGB(0,255,0), -1, CV_AA, 0);
             cvCircle(mask, center, cvRound(p[2]), CV_RGB(255,0,0),  3, CV_AA, 0);
    }

    cvNamedWindow( "Output", CV_WINDOW_AUTOSIZE );
    cvShowImage( "Output", img );
    cvNamedWindow( "mask", CV_WINDOW_AUTOSIZE );
    cvShowImage( "mask", mask );
    cvWaitKey(0);
}

有人可以帮助我获取 V4L/AVLD 并改进此代码吗?非常感谢。

最佳答案

V4L/AVLD 适用于网络摄像头。它与代码或算法没有任何关系。 http://allonlinux.free.fr/Projets/AVLD/

如果您使用的是 Linux,则需要安装 v4l-utls 软件包才能使用网络摄像头。

关于c++ - 什么是opencv中的V4L/AVLD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458034/

相关文章:

c++ - 在 windbg "x/2"结果中强制执行 vftable 条目,需要考虑什么?

linux - 使用用于检测文件的文件管理器模块检测 Linux 中的文件类型?

c++ - SVM + HOG,发现对象总是NULL

jquery - 检测 <= IE10 的最佳方法

c++ - 开罗 + openGL + 过剩 + VS 2010 + Windows 7

c++ - 解决 SPOJ ww​​w.spoj.com/problems/PRHYME/的正确方法是什么?

c++ - c中的指针是普通变量还是比这个多

c++ - 感兴趣区域的唯一性和身份

python - 特征匹配的图像相似性度量?

opencv - 无法在CMake中配置和构建OpenCV