gpt4 book ai didi

opencv - 使用 OpenCV 检测完整的圆

转载 作者:行者123 更新时间:2023-12-02 17:13:11 25 4
gpt4 key购买 nike

我有一个图像显示两个圆共享相同的中心但具有不同的半径 - 一个内圆和一个外圆。我需要检查这两个圆圈是否“破损”,这意味着圆圈的形状是否磨损或破烂。

圆圈总是具有相同的半径,因此我使用 OpenCV 的 HoughCircles 对两个圆圈中的每一个都具有给定的半径,以确定图像是否包含两个圆圈。可以毫无问题地找到圆圈。
我对图像处理相当缺乏经验,所以我想,使用 HoughCircles 只会在形状完美无瑕的情况下找到圆,但如果圆的笔划上有一些边缘或曲线,HoughCircles 也会找到圆。

有没有更好的方法来检查两个圆圈是否完整或者 HoughCircles 是完全错误的方法?我玩了一下 HoughCircles 的阈值参数,但是当阈值设置得太低时,无论它是完整的还是损坏的,算法都根本找不到圆。

编辑:这是一个抽象的图像,可能会使它更清晰。
http://1drv.ms/1toMHay
内圈坏了,外圈还行。 HoughCircles 可能会检测到两个圆圈,但不应检测到内部。

这个想法是,我有一个完整的两个圆的引用图像,以确定霍夫圆函数的正确半径、阈值和其他参数,以确保这些是用霍夫圆找到的。使用这些参数,应该分析其他图像,看看这些图像是否还包含两个完整的圆圈,或者是否至少一个圆圈看起来像我提供的图像中的内圈。

上传图片
我上传了一些真实的图像,以使我想要实现的目标更加清晰。 http://1drv.ms/1nhJJQ9
这些图像是在两种不同的光照情况下拍摄的,直接光和间接光。每组都有一个“完整”的图像和一些损坏的图像。现在我必须检测图像是否完整或损坏,我的第一种方法是查看两个圆圈是否完整或以某种方式磨损。
这些图像甚至可以实现,还是有更好的方法?

最佳答案

选项 1

太检测是否有圆圈我会坚持 OpenCV 中的 houghCircles 函数。为了检测它们是否破烂/磨损,我建议使用轮廓。

如果使用 OpenCV 函数 findContours() 您将获得图像中所有“形状”的列表。然后,您可以检查这些轮廓是否符合您的预期标准。一个圆应该在 contourArea() 之间具有一致的比率。和 arcLength() .

使用 findContours() 的示例并检查每个轮廓的面积:

//Find and draw contours
vector <vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(binaryImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

for (int i = 0; i < contours.size(); i++) {
float area = contourArea(contours[i], false);
if (area > 300) {
drawContours(inputImage, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy);
}
}

确保使用二进制图像作为输入。此示例在轮廓区域中绘制大于 300 的红色图像上的所有轮廓。

选项 2

您的另一个选择是坚持使用 houghCircles()但然后检查您找到的圆圈周围的像素。如果您从中心点扫描半径内的像素并计算二进制图像中有多少像素是白色的,您可以创建一个百分比,该百分比可能说明您的 houghCircle 与图像的匹配程度。

您可以通过以下方式检查二进制图像的像素值,您只需声明仅检查圆圈上的像素。
for(int i=0;i<binaryImage.rows;i++) {
for(int j=0;j<binaryImage.cols;j++) {
std::cout << (int)binaryImage.at<uchar>(i,j)<< ",";
}
std::cout << "\n";
}

关于opencv - 使用 OpenCV 检测完整的圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25427598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com