OpenCV特定对象检测

时间:2011-10-10 03:09:08

标签: visual-c++ image-processing opencv kinect

在做了一些研究和阅读有关OpenCV物体检测的信息后,我仍然不确定如何在视频帧中检测到棒。什么是最好的方式,所以即使用户移动它我也能检测到。我会用棍子作为剑,并用它制作光剑。我可以从哪里开始?谢谢!

3 个答案:

答案 0 :(得分:7)

对此的回答通常是Hough线变换。 Hough变换用于在场景中查找直线(或其他轮廓),OpenCV可以对这些线进行参数化,以便获得端点坐标。但是,明智的话,如果你正在做光剑效果,你不需要那么远 - 只需将橙色棒涂成橙色并做一个色度键。 Adobe Premiere,Final Cut Pro,Sony Vegas等的标准功能。此OpenCV版本是将您的帧转换为HSV颜色模式,并隔离位于您想要的色调和饱和区域的图片区域。

http://opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html?highlight=hough

这是我写的一个旧例程:

//Photoshop-style color range selection with hue and saturation parameters.
//Expects input image to be in Hue-Lightness-Saturation colorspace.
//Returns a binary mask image. Hue and saturation bounds expect values from 0 to 255.
IplImage* selectColorRange(IplImage *image, double lowerHueBound, double upperHueBound, 
                double lowerSaturationBound, double upperSaturationBound) {
    cvSetImageCOI(image, 1);  //select hue channel
    IplImage* hue1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1);
    cvCopy(image, hue1); //copy hue channel to hue1
    cvFlip(hue1, hue1); //vertical-flip
    IplImage* hue2 = cvCloneImage(hue1); //clone hue image
    cvThreshold(hue1, hue1, lowerHueBound, 255, CV_THRESH_BINARY); //threshold lower bound
    cvThreshold(hue2, hue2, upperHueBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound
    cvAnd(hue1, hue2, hue1); //intersect the threshold pair, save into hue1
    cvSetImageCOI(image, 3); //select saturation channel
    IplImage* saturation1 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1);
    cvCopy(image, saturation1); //copy saturation channel to saturation1
    cvFlip(saturation1, saturation1); //vertical-flip
    IplImage* saturation2 = cvCloneImage(saturation1); //clone saturation image
    cvThreshold(saturation1, saturation1, lowerSaturationBound, 255, CV_THRESH_BINARY); //threshold lower bound
    cvThreshold(saturation2, saturation2, upperSaturationBound, 255, CV_THRESH_BINARY_INV); //threshold inverse upper bound
    cvAnd(saturation1, saturation2, saturation1); //intersect the threshold pair, save into saturation1
    cvAnd(saturation1, hue1, hue1); //intersect the matched hue and matched saturation regions
    cvReleaseImage(&saturation1);
    cvReleaseImage(&saturation2);
    cvReleaseImage(&hue2);
    return hue1;
}

有点冗长,但你明白了!

答案 1 :(得分:2)

您可以从遵循为OpenCV编写的面部识别(训练和检测)技术开始。

如果您正在寻找具体步骤,请与我们联系。

答案 2 :(得分:2)

我的老教授总是说计算机视觉的第一定律是尽可能地对图像做任何事情,以使你的工作更轻松。

如果你可以控制棒子的外观,那么你可能会有最好的运气画棒非常特殊的颜色 - 霓虹粉色或者不太可能出现在背景中的东西 - 然后使用颜色分段结合连通分量标记。那会非常快。