我在使用 JavaCV 实现的这个项目中遇到了问题。我想至少找到二值图像中最顶部、最底部、最左侧和最右侧的点:
我这里指的点是 (x,y) 坐标。我已经尝试实现 HoughLines(它只检测直线而不检测曲线)和 cvFindContours,但我无法正确提取坐标。我还是个新手,如果我知道白线和背景的值(value)是多少,也许我可以绕着图像转一圈。
有没有更简单的出路?非常感谢您的帮助。
您可以在此处使用循环来查找最左、最右、最上和最下点。但是,您需要考虑如何制作智能循环。您可以循环遍历所有像素,但您也可以使用更智能的方法。例如,最左边的点可能在左边的某个地方。所以如果你使用从左到右的扫描线,你可能比只扫描顶部->底部更有可能找到这个像素。也就是说,从图像中获取值非常容易。
假设我们有一张图片 binaryImg
有 n 个 channel 。在灰度图像的情况下 n 应该是 1,但在彩色图像的情况下 n 应该是 3。假设我们有索引 0 <= y < height
, 0 <= x < width
和 0 <= k < n
.我们可以得到一个pixel(x, y)的值如下:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k]
由于灰度图像只有一个 channel ,我们可以使用以下方法检查像素是否为白色:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255
就速度而言,此解决方案的最坏情况时间为 O(n),但实际上您不必查看所有像素。
我是一名优秀的程序员,十分优秀!