我正致力于检测任何物体的形状。我有一个二进制图像,其中背景是白色的,前景/对象是黑色的。我需要检测前景中黑色物体的形状。
我该怎么做呢?形状可能是人/车/盒子等,请帮助
发布于 2010-04-06 10:16:20
安非他玛说,我不确定你的最终目标是什么,但检测形状的一个非常常见的方法是使用cvFindContours,它给出一个二进制图像,并返回一组“CvContour”(实际上是一个cvSeq)。通过对图像进行阈值处理(cvThreshold),可以非常简单地检索二值图像。查看opencv src目录的sample/中的contours.c示例。也请检查此链接:
Noah (2009) opencv tutorial
下面的示例代码将为您提供一个大致的概念:
cvThreshold( g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY );
cvFindContours( g_gray, g_storage, &contours );
cvZero( g_gray );
if( contours ){
cvDrawContours(
g_gray,
contours,
cvScalarAll(255),
cvScalarAll(255),
100 );
}
cvShowImage( "Contours", g_gray );一旦您有了轮廓的编码,您就可以使用cvMatchShapes,它采用2个轮廓并返回这些轮廓之间的相似性度量。
希望这种方法能为您提供一个良好的开端!
发布于 2010-04-14 15:24:03
对于精确的形状检测,您需要使用haar检测或至少K近邻。Haar检测可以非常准确,但它需要很长时间才能设置。K近邻更容易设置,但不是很准确。查看this youtube video。这家伙正在使用KNN来检测不同的手势。请注意,对比图像基本上是一个黑色斑点。KNN的缺点是它需要更多的资源来运行程序,但是对于haar检测,当您使用haartraining.exe创建级联xml文件时,主要的处理已经完成了。
https://stackoverflow.com/questions/2574369
复制相似问题