我一直在使用opencv-3.2做关于Python的计算机视觉的任务。 现在我很难提取特征点的准确位置。 图片就像this。你有没有一个好主意,提取特征点的位置
二进制图像就像 this。
我必须知道板中椭圆的精确位置。
我尝试使用cv2.findContours,但我发现很难获得满意的结果。选择一块可以减少噪音影响的区域后,我正在考虑使用cv2.findContours。但是,考虑到照片的数量,这是很难实现的。 所以我正在寻找一个更好的主意。
我一直在使用opencv-3.2做关于Python的计算机视觉的任务。 现在我很难提取特征点的准确位置。 图片就像this。你有没有一个好主意,提取特征点的位置
二进制图像就像 this。
我必须知道板中椭圆的精确位置。
我尝试使用cv2.findContours,但我发现很难获得满意的结果。选择一块可以减少噪音影响的区域后,我正在考虑使用cv2.findContours。但是,考虑到照片的数量,这是很难实现的。 所以我正在寻找一个更好的主意。
继评论,存在用于实现该两种可能的方法:
方法1:SimpleBlobDetector
该检测器被调谐以检测圆形斑点。 代码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 轮廓可能需要为参考图像过滤。你可以这样做:
创建两个零像素值的二进制图像,一个是绘制轮廓,另一个是绘制椭圆。
扫描每个轮廓并将其绘制在二进制图像中,同时将椭圆绘制到其他二进制对应的轮廓。对于这两种情况,请使用CV_FILLED
作为厚度参数。
现在在两个二值图像之间执行bitwise_xor
并计算结果上的非零像素的数量。如果结果接近零,则轮廓与椭圆相同,否则不相等。
重复每个轮廓。
PS。我仍然认为HoughTransform可以工作,但是使用哪种方法取决于你自己决定。 希望它有帮助!
你见过[this](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html) –
确定这似乎有效,明天我会试试。无论如何,睡觉时间,thx! – lelle
[this](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html)适用于python – lelle