我使用JavaCV实现了我的这个项目的问题。我想至少找到二进制图像中最顶部,最底部,最左边和最右边的点:
我的意思是(x,y)坐标。我已经尝试实现HoughLines(它只检测线而不是曲线)和cvFindContours,但我无法正确提取坐标。我仍然是新手,如果我知道白线和背景的价值是什么,那么也许我可以绕着图像循环。
有更简单的方法吗?非常感谢您的帮助。
答案 0 :(得分:2)
您可以在此处使用循环查找最左侧,右侧,顶部和底部点。但是,您需要考虑如何制作智能循环。您可以遍历所有像素,但您也可以使用更智能的方法。例如,最左边的点可能在左边的某个地方。因此,如果您使用从左到右的扫描线,您可能比仅扫描顶部>底部更有可能找到此像素。话虽如此,从图像中获取值非常容易。
假设我们有一个带有 n 频道的图片binaryImg
。如果灰度图像 n 应为1,但在彩色图像的情况下 n 应为3.假设我们有索引0 <= y < height
, 0 <= x < width
和0 <= k < n
。我们可以像素(x,y)的值如下:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k]
由于灰色图像只有一个通道,我们可以使用以下方法检查像素是否为白色:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255
就速度而言,此解决方案将给出O(n)的最坏情况时间,但实际上您不必查看所有像素。
答案 1 :(得分:0)
如果你有像std::vector<cv::Point2f> pts
这样的点矢量,那么你可以使用opencv cv::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中使用相应的函数