0
我真的很想知道检测和提取边缘的起点和终点的最佳方法是,如果我得到像这样的图像和不同角度的黑色材质。如何使用OpenCV检测边缘的起点和终点?
我发现一些想法,其使用的是高斯模糊和精明的运营商,用于检测边缘。但我也想提取第一个和最后一个点的确切像素位置。如果有人能够告诉我完成这项任务的正确的一步一步的概念,那将是非常棒的。
我真的很想知道检测和提取边缘的起点和终点的最佳方法是,如果我得到像这样的图像和不同角度的黑色材质。如何使用OpenCV检测边缘的起点和终点?
我发现一些想法,其使用的是高斯模糊和精明的运营商,用于检测边缘。但我也想提取第一个和最后一个点的确切像素位置。如果有人能够告诉我完成这项任务的正确的一步一步的概念,那将是非常棒的。
如果所有图片都与您发布的图片相似(即所有边缘与图片的顶部和左侧相交),则以下简单程序会查找边缘的右上角和左下角的行号:
cv::Mat im, edge, locs;
im = cv::imread("./lBnUO.jpg", cv::IMREAD_GRAYSCALE);
cv::Canny(im, edge, 0.0, 255.0);
cv::findNonZero(edges(cv::Range(0, 1), cv::Range(0, edge.cols)), locs);
int topRightCol = (locs.at<cv::Point>(0)).x;
cv::findNonZero(edges(cv::Range(0, edge.rows), cv::Range(0, 1)), locs);
int bottomLeftRow = (locs.at<cv::Point>(0)).y;
std::cout << "Top-right point column: " << topRightCol << ", bottom-left point row: "
<< bottomLeftRow << std::endl;
如果你不能确定的边缘相交的图像的顶部和左侧,全edge
图像上使用cv::findNonZero
代替,这可能在某些情况下是难以预料:
cv::Mat im, edge, locs;
im = cv::imread("./lBnUO.jpg", cv::IMREAD_GRAYSCALE);
cv::Canny(im, edge, 0.0, 255.0);
cv::findNonZero(edge, locs);
int topRightCol = (locs.at<cv::Point>(0)).x;
int bottomLeftRow = (locs.at<cv::Point>(locs.rows-1)).y;
std::cout << "Top-right point column: " << topRightCol << ", bottom-left point row: "
<< bottomLeftRow << std::endl;
对于我法师在这里提供两种以上验证码会打印出:
Top-right point column: 190, bottom-left point row: 160
也许'cvFindContours',然后再采取最低x和maximim X轮廓的各点?只是真的适合那个例子图像! –
为什么不使用模糊来查找边缘,然后使用原始图像来查找像素精确位置? – elactic
如果你澄清了你可以做出的假设,这将有所帮助。在您的示例图像中,唯一的颜色是黑色和白色。也只有一个边缘。您标记的结果线是直的,并一直延伸到图像上。所有这些事情总会是真的吗? – Hammer