2017-04-05 54 views
1

我一直在使用opencv-3.2做关于Python的计算机视觉的任务。 现在我很难提取特征点的准确位置。 图片就像this你有没有一个好主意,提取特征点的位置

二进制图像就像 this

我必须知道板中椭圆的精确位置。

我尝试使用cv2.findContours,但我发现很难获得满意的结果。选择一块可以减少噪音影响的区域后,我正在考虑使用cv2.findContours。但是,考虑到照片的数量,这是很难实现的。 所以我正在寻找一个更好的主意。

+0

你见过[this](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html) –

+0

确定这似乎有效,明天我会试试。无论如何,睡觉时间,thx! – lelle

+0

[this](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html)适用于python – lelle

回答

0

继评论,存在用于实现该两种可能的方法:

方法1SimpleBlobDetector

该检测器被调谐以检测圆形斑点。 代码C++

Mat image = imread("image.jpg"); 
Ptr<FeatureDetector> blobsDetector = FeatureDetector::create("SimpleBlob"); 
vector<KeyPoint> keypoints; 
blobsDetector->detect(image, keypoints); 
// Drawing 
Mat drawImage = image.clone(); 
for (size_t i = 0; i < keypoints.size(); ++i){ 
    circle(drawImage, keypoints[i].pt, 4, Scalar(255, 0, 255), -1); } 
imwrite("result.png", drawImage);` 

方法2:由于OP所述轮廓检测。 Reference 轮廓可能需要为参考图像过滤。你可以这样做:

  1. 创建两个零像素值的二进制图像,一个是绘制轮廓,另一个是绘制椭圆。

  2. 扫描每个轮廓并将其绘制在二进制图像中,同时将椭圆绘制到其他二进制对应的轮廓。对于这两种情况,请使用CV_FILLED作为厚度参数。

  3. 现在在两个二值图像之间执行bitwise_xor并计算结果上的非零像素的数量。如果结果接近零,则轮廓与椭圆相同,否则不相等。

  4. 重复每个轮廓。

PS。我仍然认为HoughTransform可以工作,但是使用哪种方法取决于你自己决定。 希望它有帮助!