Visual c++ OpenCV特定对象检测

Visual c++ OpenCV特定对象检测,visual-c++,image-processing,opencv,kinect,Visual C++,Image Processing,Opencv,Kinect,在做了一些研究并阅读了有关OpenCV对象检测的信息之后,我仍然不确定如何检测视频帧中的木棒。哪种方法是最好的,这样即使用户移动它,我也能检测到。我要把这根棍子当作剑,用它做一把光剑。我可以从哪里开始?谢谢 您可以从以下为OpenCV编写的人脸识别(训练和检测)技术开始 如果您正在寻找具体的步骤,请告诉我。这一问题的答案通常是Hough线变换。Hough变换用于在场景中查找直线(或其他轮廓),OpenCV可以参数化这些直线,以便获得端点坐标。但是,对智者来说,如果你在做光剑效果,你不需要走那么远

在做了一些研究并阅读了有关OpenCV对象检测的信息之后,我仍然不确定如何检测视频帧中的木棒。哪种方法是最好的,这样即使用户移动它,我也能检测到。我要把这根棍子当作剑,用它做一把光剑。我可以从哪里开始?谢谢

您可以从以下为OpenCV编写的人脸识别(训练和检测)技术开始


如果您正在寻找具体的步骤,请告诉我。

这一问题的答案通常是Hough线变换。Hough变换用于在场景中查找直线(或其他轮廓),OpenCV可以参数化这些直线,以便获得端点坐标。但是,对智者来说,如果你在做光剑效果,你不需要走那么远——只需把棍子涂成橙色,然后做一个色度键。Adobe Premiere、Final Cut Pro、Sony Vegas等的标准功能。OpenCV版本的这是将您的帧转换为HSV颜色模式,并隔离图片中处于所需色调和饱和度区域的区域

以下是我作为示例编写的一个旧例程:

//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;
}

有点罗嗦,但你明白了

我的老教授总是说,计算机视觉的第一定律是尽你所能处理图像,使你的工作更容易


如果您可以控制棒的外观,那么您可能会很幸运地将棒涂成一种非常特定的颜色——霓虹粉或不太可能出现在背景中的颜色——然后使用颜色分割与连接的组件标签相结合。那会很快

嗯。。。不知道这对跟踪一根棍子有多重要。嗨,马特,想象一下:一根棍子,通常想象成一个圆柱形物体。可以在三维空间中任何位置的圆柱体。有些情况下,我们可以检测和跟踪类似的圆柱形物体,如笔!同样,此类物体上的独特特征总是有助于改进检测/跟踪。所以,你可能需要对这根“棍子”上的不同特征进行分类。这样一个物体的样本图像,无论是负片还是正片,都会帮助我改进对你的建议。有人,我猜你添加了Hough变换代码来检测棍子!但是必须考虑任何物体的方向。遮挡是另一个方面。Lowe的论文在这方面有帮助。我应该使用斑点跟踪器来获取我的棍子的长度吗?或者有没有其他方法来获得我的棍子的起点和终点?谢谢您可以
查找二进制图像的构造函数。使用
轮廓区域
查找最大的
轮廓
,然后使用
minarealect
获得
rotatedlect
,一个围绕
轮廓的边界形状。
rotatedlect
的高度将是你的棍子长度。我使用了FindConteurs,我认为创建的矩形不太稳定,尤其是当对象移动时。然后我使用了Hough变换CV_Hough_概率,它完成了这项工作。谢谢。