2012-07-04 174 views
4

我目前正试图检索轮廓边界内存在的所有黑色像素。我对轮廓边界不感兴趣,而是对位于边界内的黑色像素感兴趣,并组成实际图像。如果我能得到图像的实际坐标,那将是非常好的。OpenCV获得轮廓边界内的黑色像素

我曾尝试使用copyTo方法使用掩码,但我相信我没有设置正确的参数。虽然,我也尝试使用Core.fillPoly,它使用命令中指定的颜色填充整个轮廓区域,并且获取像素信息没有帮助。任何人都可以在这里指导我吗?我正在使用OpenCV 2.3.1开发Android 2.2。

回答

4

有一组落在轮廓边界内的像素。还有一组黑色的像素。您想要找到这两个集合的交集,即边界内都是黑色的像素集合。

要做到这一点我想:

  1. 画出轮廓的填充形状,黑底白字(以自己的形象),所以它是一个面具。 您可以使用cv::drawContourscv::fillPoly

  2. 将图像中的黑色像素过滤为另一个蒙版。 您可以使用cv::thresholdTHRESH_BINARY_INV,阈值为零。

  3. 使用bitwise_and或简称&操作者等matResult = mat1 & mat2;

结果相同的尺寸具有非零值的图像的矩阵仅对于满足您准则的像素查找相交集在轮廓内而在图像中为黑色。通过循环矩阵并测试非零值,可以获得单个坐标。

+0

感谢Brian,看起来很有希望。我会尝试一下,让你知道。 –

+0

嘿大脑,这是我已经实现的代码片段,它似乎在android模拟器上测试的工作。但是,当我尝试将最终矩阵转换为一组矢量时,该应用程序崩溃。我正在转换它,以便我可以查看Mat保存的非零像素。请指教。它在这一行上失败了 - 'Converters.Mat_to_vector_Point(finalResult,points);'我已经用这个命令获得了最后一块 - 'Core.bitwise_and(mGrayC4,contourRegion,finalResult);' –

+0

我假设你已经初始化了'points'清单?您可以尝试检查中间矩阵以检查它们是否符合您的期望。否则,如果没有看到更多的代码,我很难知道问题所在。 –