JavaCV:如何在二进制图像中查找重要点

时间:2012-04-18 02:46:24

标签: opencv expression binary-data javacv

我使用JavaCV实现了我的这个项目的问题。我想至少找到二进制图像中最顶部,最底部,最左边和最右边的点:

Happy Mouth Binary image

我的意思是(x,y)坐标。我已经尝试实现HoughLines(它只检测线而不是曲线)和cvFindContours,但我无法正确提取坐标。我仍然是新手,如果我知道白线和背景的价值是什么,那么也许我可以绕着图像循环。

有更简单的方法吗?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以在此处使用循环查找最左侧,右侧,顶部和底部点。但是,您需要考虑如何制作智能循环。您可以遍历所有像素,但您也可以使用更智能的方法。例如,最左边的点可能在左边的某个地方。因此,如果您使用从左到右的扫描线,您可能比仅扫描顶部>底部更有可能找到此像素。话虽如此,从图像中获取值非常容易。

假设我们有一个带有 n 频道的图片binaryImg。如果灰度图像 n 应为1,但在彩色图像的情况下 n 应为3.假设我们有索引0 <= y < height0 <= x < width0 <= 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中使用相应的函数