Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用OpenCV检测边的端点和起点?_Opencv_Image Processing_Edge Detection - Fatal编程技术网

如何使用OpenCV检测边的端点和起点?

如何使用OpenCV检测边的端点和起点?,opencv,image-processing,edge-detection,Opencv,Image Processing,Edge Detection,我真的想知道检测和提取边缘起点和终点的最佳方法是什么,如果我得到这样的图像,黑色材质的角度不同 我发现了一些使用高斯模糊和canny算子来检测边缘的想法。但是我还想提取第一个和最后一个点的精确像素位置。如果有人能告诉我完成这项任务的正确分步概念,那就太棒了。如果你的所有图片都与你发布的图片相似(即所有边都与图像的顶部和左侧相交),下面的简单程序会找到边的右上列和左下行编号: cv::Mat im, edge, locs; im = cv::imread("./lBnUO.jpg", cv::

我真的想知道检测和提取边缘起点和终点的最佳方法是什么,如果我得到这样的图像,黑色材质的角度不同


我发现了一些使用高斯模糊和canny算子来检测边缘的想法。但是我还想提取第一个和最后一个点的精确像素位置。如果有人能告诉我完成这项任务的正确分步概念,那就太棒了。

如果你的所有图片都与你发布的图片相似(即所有边都与图像的顶部和左侧相交),下面的简单程序会找到边的右上列和左下行编号:

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;
对于此处提供的图像,上面的两个代码都将打印出来:

Top-right point column: 190, bottom-left point row: 160

可能先
cvFindContours
,然后取轮廓上最小x和最大x的点?不过,这只适用于该示例图像!为什么不使用模糊来找到边缘,然后使用原始图像来找到像素精确的位置呢?如果你能澄清你可以做出的假设,这会有所帮助。在您的示例图像中,只有黑色和白色。也只有一条边。标记的结果线是直的,并一直延伸到整个图像。所有这些事情都是真的吗?
Top-right point column: 190, bottom-left point row: 160