我正在研究检测任何物体的形状。我有一个二进制图像,其中背景为白色,前景/对象为黑色。我需要检测前景中黑色物体的形状。
我该怎么办?形状可以是男/车/盒等。请帮忙
答案 0 :(得分:2)
我不确定你的最终目标是什么,因为amphetamachine说但是一种非常常见的检测形状的方法可能是使用 cvFindContours 给出二进制图像并返回一组' CvContour '(实际上是cvSeq)。通过阈值化图像(cvThreshold)可以非常简单地检索二值图像。查看示例/ opencv src目录中的contours.c示例。也请查看此链接:
此示例代码将为您提供一般概念:
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个等高线并返回这些轮廓之间的相似度。
希望这种方法能为您提供一个良好的开端!
答案 1 :(得分:2)
为了准确检测形状,您需要使用haar检测或至少K个最近邻居。 Haar检测可以非常准确,但设置需要很长时间。 K最近邻居更容易设置但不准确。查看this youtube video。这家伙正在使用KNN来检测不同的手势。请注意,比较图像基本上是黑色斑点。关于KNN的坏处是它运行程序需要更多的资源,但是通过haar检测,当你用haartraining.exe创建cascade xml文件时,主要的处理工作已经完成了