Gyo*_*ely 8 opencv image-processing
我有一个OpenCV应用程序来自办公室内部的网络摄像头流(很多细节),我必须找到一个人工标记.标记是在白色背景的一个黑角规.我使用Canny来查找边缘和cvFindContours进行轮廓加工,然后使用aboutPolyDP和co.用于过滤和查找候选者,然后使用局部直方图进一步过滤,bla bla bla ...
这或多或少有效,但不完全是我想要的.FindContours总是返回一个闭环,即使Canny创建一个非闭合线.我得到一个轮廓走在线的两侧形成一个环.对于坎尼图像(我的标记)上封闭的边缘,我得到2个轮廓,一个在里面,和其他在外面.我不得不对这个操作有问题:
我为每个标记得到2个轮廓(不是那么严重)
最简单的过滤是不可用的(拒绝非闭合轮廓)
所以我的问题是:是否可以为非封闭的Canny边缘获得非闭合轮廓? 或者解决上述两个问题的标准方法是什么?
Canny是一个非常好的工具,但我需要一种方法将2D黑白图像转换为易于处理的东西.类似连接组件的东西,列出组件的步行顺序中的所有像素.所以我可以过滤循环,并将其提供给approxPolyDP.
更新:我错过了一些重要的细节:标记可以处于任何方向(它不是面向摄像机的正面,没有直角),实际上我正在做的是3D方向估计,基于标记的2D投影.
Gyo*_*ely 13
我找到了问题中2个问题的简洁解决方案.技巧是启用2级层次结构生成(在findCountours中)并查找具有父级的轮廓.这将返回封闭的Canny边缘的内部轮廓,仅此而已.非闭合边缘被自动丢弃,每个标记将具有单个轮廓.
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(CannyImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point(0,0) );
for (unsigned int i=0; i<contours.size(); i++)
if (hierarchy[i][3] >= 0) //has parent, inner (hole) contour of a closed edge (looks good)
drawContours(contourImage, contours, i, Scalar(255, 0, 0), 1, 8);
Run Code Online (Sandbox Code Playgroud)
它也可以反过来,即:查找具有子元素的等高线(层次结构[i] [2]> = 0),但在我的情况下,父检查会产生更好的结果.
| 归档时间: |
|
| 查看次数: |
20681 次 |
| 最近记录: |