物体检测 Android OpenCV

5
使用安卓手机拍照后,我想通过点击图片中的物体来识别它。在大多数情况下,可能的物体如下:
1. 标尺
2. 人
3. 铅笔
我正在使用android预编译的opencv版本2.3.1,并尝试点击标尺对象并进行漫水填充以标记它,但如果轮廓不闭合,则整个图片将被填充。
a)我还尝试了点击标尺对象并向南、北、东、西移动以查看边缘并收集这些坐标,但我遇到了严重的问题(不要问)。

问题:
1. 是否有可能以某种方式关闭轮廓以仅填充所需的对象?
2. 我实际上想找到的是(例如)标尺的底部和高度的坐标。
任何其他解决方案都将不胜感激。您会如何实现它?

更新:我解决了问题a),目前使用此方法(不太满意)。我也尝试了Entreco的方法,但似乎尚未提供所需的解决方案。

1个回答

7

我不知道你是否尝试过这个方法,但通常情况下,你可以通过先处理图像来获得更好的结果。

1) 应用 高斯模糊 去除噪点

2) 应用 自适应阈值 -> 将图像转换为黑白

3) 应用 膨胀 操作,填充裂缝

通过使用不同的自适应阈值和膨胀操作设置,你可能能够获得闭合轮廓...

我使用的一个示例是这样的:

// 1) Apply gaussian blur to remove noise
Imgproc.GaussianBlur(mGraySubmat, mIntermediateMat, new Size(11,11), 0);

// 2) AdaptiveThreshold -> classify as either black or white
Imgproc.adaptiveThreshold(mIntermediateMat, mIntermediateMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 2);

// 3) Invert the image -> so most of the image is black
Core.bitwise_not(mIntermediateMat, mIntermediateMat);

// 4) Dilate -> fill the image using the MORPH_DILATE
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3,3), new Point(1,1));
Imgproc.dilate(mIntermediateMat, mIntermediateMat, kernel);

非常感谢您的回答,@Entreco。我会尝试并报告结果。 - gartenabfall
@Entreco,我们能否在封闭轮廓周围画一个矩形? - Qadir Hussain
如果黑色矩形物体没有被检测到,那么边缘也不会被检测到。 - MIkka Marmik

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