我的这个项目使用 JavaCV 实现时遇到问题。我想至少找到二进制图像中最顶部、最底部、最左侧和最右侧的点:
我的意思是这里的点是 (x,y) 坐标。我已经尝试实现 HoughLines (它只检测线但不检测曲线)和 cvFindContours 但我无法正确提取坐标。我还是个新手,如果我知道白线和背景的值是多少,那么也许我可以在图像周围循环。
有没有更简单的出路?非常感谢您的帮助。
我的这个项目使用 JavaCV 实现时遇到问题。我想至少找到二进制图像中最顶部、最底部、最左侧和最右侧的点:
我的意思是这里的点是 (x,y) 坐标。我已经尝试实现 HoughLines (它只检测线但不检测曲线)和 cvFindContours 但我无法正确提取坐标。我还是个新手,如果我知道白线和背景的值是多少,那么也许我可以在图像周围循环。
有没有更简单的出路?非常感谢您的帮助。
您可以在此处使用循环来查找最左侧、右侧、顶部和底部的点。但是,您需要考虑如何制作智能循环。您可以循环遍历所有像素,但也可以使用更智能的方法。例如,最左边的点可能在左边的某个地方。因此,如果您使用从左到右的扫描线,您可能比仅扫描顶部-> 底部更有可能找到该像素。话虽如此,从图像中获取值很容易。
假设我们有一个binaryImg
具有n 个通道的图像。在灰度图像的情况下,n应该是 1,但在彩色图像的情况下,n应该是 3。假设我们有索引0 <= y < height
和。我们可以按如下方式计算像素(x,y)的值:0 <= x < width
0 <= k < n
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k]
由于灰度图像只有一个通道,我们可以使用以下方法检查像素是否为白色:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255
就速度而言,此解决方案将给出 O(n) 的最坏情况时间,但实际上您不必查看所有像素。
如果你有一个点向量,std::vector<cv::Point2f> pts
那么你可以使用 opencvcv::boundingRect
方法来计算你的点集的右边界矩形。像这样使用它:
// this is your set of floating point (filled vector)
std::vector<cv::Point2f> pts;
// convert to matrix
cv::Mat ptsmat(pts);
// compute the bounding rectangle
cv::Rect bbox = cv::boundingRect(ptsmat);
我使用了 c++ opencv api 但你可以在 javacv 中使用相应的函数