在轮廓边界内获取黑色像素的OpenCV方法

4
我正在尝试检索所有位于轮廓边界内的黑色像素。我对轮廓边界不感兴趣,而是对位于边界内并构成实际图像的黑色像素感兴趣。如果我能获得图像的实际坐标,那就太好了。
我尝试使用使用掩码的copyTo方法,但我认为我没有设置正确的参数。同时,我也尝试使用Core.fillPoly,但它只是用指定命令中的颜色填充整个轮廓区域,无法获取像素信息。请问有人可以在这里给我指导吗?我正在使用Android 2.2和OpenCV 2.3.1。
1个回答

5

有一组像素落在轮廓边界内。还有一组黑色像素。你想要找到这两组像素的交集,也就是既在边界内又是黑色的像素集合。

为了做到这一点,我会:

  1. 将轮廓绘制成一个填充形状,白色在黑色背景下(在自己的图像中),以便它成为掩模。 您可以使用cv::drawContourscv::fillPoly

  2. 从图像中过滤出黑色像素作为另一个掩模。 您可以使用cv::thresholdTHRESH_BINARY_INV和阈值为零。

  3. 使用bitwise_and或简单地使用&运算符查找交集集合,例如matResult = mat1 & mat2;

结果是一个与您的图像大小相同的矩阵,只有满足您的在轮廓内且在图像中为黑色的条件的像素才具有非零值。 您可以通过循环遍历此矩阵并测试非零值来获取各个坐标。


谢谢Brian,看起来很有前途。我会尝试一下然后告诉你。 - Angad Adivrekar
嗨Brain,这是我实现的代码片段,经过在Android模拟器上测试,目前似乎可以正常工作。但是,当我尝试将最终矩阵转换为一组向量时,应用程序会崩溃。我正在进行转换,以便查看Mat保留的非零像素。请给予建议。它在此行失败-Converters.Mat_to_vector_Point(finalResult, points);我使用此命令获得了最终mat-'Core.bitwise_and(mGrayC4,contourRegion,finalResult);` - Angad Adivrekar
我假设您已经初始化了“points”列表?您可以尝试检查中间矩阵以确保它们保存了您所期望的内容。否则,如果没有看到更多代码,我很难知道问题出在哪里。 - Brian L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接