检测视频流上的几何对象并重建其轮廓

我试图在C ++上使用OpenCV 2.4.9来检测视频流上的塑料物体。 该物体有六个角度,其轮廓如下所示: 。
对于每帧我正在做一些分割和边缘检测。 在这些操作之后,我得到了一些二值图像,其中包含对象的轮廓损坏和背景噪音。
例如: 要么

我需要以某种方式在这里检测我的对象并恢复轮廓。 你能建议一些方法吗? 我需要一个快速的方法,因为我想在android手机上运行这个程序。

我知道我的对象的比例。 相机总是大致与物体表面垂直。
有时候,轮廓没有被破坏太多,我可以找到正确的边界框,但在其他情况下,我不能。
我认为我需要以某种方式使用有关对象几何的信息。 我会感谢任何帮助!

UPD
如果我找到了对象的局部轮廓,是否有可能以某种方式将我的形状放入找到的轮廓中以获取缺失的线条?


鉴于形状是一个相当规则的多边形,您是否尝试过运行Hough Lines并计算交点来查找顶点?

即使你不能得到所有的顶点,如果你得到6个中的4个,你应该能够重建丢失的顶点。

以下使用Hough Probabilistic Lines来识别可能的线段。 设置最小线长可以避免一定量的噪音。

然后,我在所有发现的线段的终点上使用kmeans来标识6个可能的顶点。

对于我测试过的一张图像,结果是可以的,但如果您的图像中有很多其他人工痕迹,则可能需要进行一些额外的异常删除

Mat image = imread(image_name);

// Convert to grey scale    
Mat grey;
cvtColor(image, grey, CV_RGB2GRAY);

// Invert colour scheme
grey = 255 - grey;

// Find Hough probabilistic lines
vector<Vec4i> lines;
double rho( 1 );
double theta( M_PI / 180.0 );
int thresh( 10 );
double minLineLength(20.0);
double maxLineGap( 5.0);
HoughLinesP(grey, lines, rho, theta, thresh, minLineLength, maxLineGap);

// Store end points of these segments as vertices
vector<Point2f> vertices;
for( int i=0; i<lines.size(); i++ ) {
    float x1 = lines[i][0];
    float y1 = lines[i][1];
    float x2 = lines[i][2];
    float y2 = lines[i][3];
    vertices.push_back(Point2f(x1, y1) );
    vertices.push_back(Point2f( x2, y2) );
}

// Run kMeans on line ends to find 6 centres which we assume are verts
TermCriteria criteria(TermCriteria::EPS+TermCriteria::COUNT, 500, 1.0);
int attempts(20);
Mat centres, labels;
kmeans(vertices, 6, labels, criteria, attempts, KMEANS_PP_CENTERS, centres );

// Plot them on the RGB image
for( int i=0; i<6; i++ ) {
    Point2f v1 = Point2f( vertices[i].x-2, vertices[i].y-2 );
    Point2f v2 = Point2f( vertices[i].x-2, vertices[i].y+2 );
    Point2f v3 = Point2f( vertices[i].x+2, vertices[i].y-2 );
    Point2f v4 = Point2f( vertices[i].x+2, vertices[i].y+2 );
    line(image, v1, v4, Scalar(255,255,0));
    line(image, v2, v3, Scalar(255,255,0));
}

imshow( "Verts", image );
cout << centres << endl;

您可以看到最上面的两点实际上位于同一位置。 我猜这是因为有几个缺失的顶点。 尽管如此,其他人的位置也很好,你可以通过形状的对称性来恢复丢失的部分。

链接地址: http://www.djcxy.com/p/58727.html

上一篇: Detect geometric object on video stream and reconstruct its contours

下一篇: General contour detection