我真的很想知道检测和提取边缘起点和终点的最佳方法是什么,如果我得到这样的图像,黑色材料的不同角度。
我发现了一些使用高斯模糊和精明算子来检测边缘的想法。但我也想提取第一个和最后一个点的确切像素位置。如果有人能告诉我完成这项任务的正确分步概念,那将是非常棒的。
我真的很想知道检测和提取边缘起点和终点的最佳方法是什么,如果我得到这样的图像,黑色材料的不同角度。
我发现了一些使用高斯模糊和精明算子来检测边缘的想法。但我也想提取第一个和最后一个点的确切像素位置。如果有人能告诉我完成这项任务的正确分步概念,那将是非常棒的。
如果您的所有图片都与您发布的图片相似(即所有边缘都与图像的顶部和左侧相交),则以下简单程序会找到边缘的右上角列和左下角行号:
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;
如果您不确定边缘是否与图像的顶部和左侧相交,请改为cv::findNonZero
在完整edge
图像上使用,这在某些情况下可能难以预测:
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