我一直在使用 opencv-3.2 在 python 上做一个关于计算机视觉的作业。 现在我很难提取特征点的准确位置。 图像类似于this .
二进制图像就像 this .
我必须知道椭圆在盘子中的准确位置。
我尝试使用cv2.findContours,但我发现很难获得满意的结果。我正在考虑在选择一 block 可以减少噪音影响的区域后使用 cv2.findContours。但是,考虑到图片的数量,这很难实现。 所以我正在寻找更好的主意。
最佳答案
根据评论,有两种可能的方法可以实现这一点:
方法 1:SimpleBlobDetector
这个检测器被调整来检测圆形 Blob 。 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
并计算结果中非零像素的数量。如果结果接近于零,则轮廓与椭圆相同,否则不是。对每个轮廓重复。
附言。我仍然认为 HoughTransform 可以工作,但使用哪种方法由您决定。 希望对您有所帮助!
关于python - 提取特征点位置有什么好办法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43233997/