我是openCV的新手,我一直在为Android提供的示例。在纸上检测黑色墨水斑点 - Opencv Android
我的目标是检测色块,所以我开始使用色块检测示例。
我将彩色图像转换为灰度,然后使用二进制阈值进行阈值处理。
背景是白色的,斑点是黑色的。我想检测那些黑色斑点。此外,我想绘制他们的轮廓颜色,但我不能做到这一点,因为图像是黑色和白色。
我已经设法在灰度中实现这一点,但我不喜欢如何绘制轮廓,这就像颜色容差太高,轮廓比实际的斑点大(可能斑点太小?)。我想我谈论的这个'宽容'与setHsvColor有关,但我不太明白这个方法。
在此先感谢!顺祝商祺
更新的详细信息
我要跟踪的图像是墨分裂的。想象一张白纸与黑色墨水分裂。现在我正在实时进行拍摄(相机视图)。实际的应用程序会拍摄照片并分析该照片。
正如我上面所说的,我从openCV GitHub回购中获取了color-blob-detection示例(android)。我在onCameraFrame方法添加以下代码(为了将其转换为黑白实时)的皈依制成,所以如果油墨是黑色,蓝色,红色,我不介意:
mRgba = inputFrame.rgba();
/**************************************************************************/
/** BLACK AND WHITE **/
// Convert to Grey
Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
Mat blackAndWhiteMat = new Mat (H, W, CvType.CV_8U, new Scalar(1));
double umbral = 100.0;
Imgproc.threshold(mRgba, blackAndWhiteMat , umbral, 255, Imgproc.THRESH_BINARY);
// convert back to bitmap for displaying
Bitmap resultBitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
blackAndWhiteMat.convertTo(blackAndWhiteMat, CvType.CV_8UC1);
Utils.matToBitmap(blackAndWhiteMat, resultBitmap);
/**************************************************************************/
这可能不是最好的方法,但它的工作原理。
现在我想检测黑色斑点(墨水分割)。我想他们会被检测到,因为Logcat(示例应用程序的日志条目)会抛出检测到的轮廓数量,但我无法看到它们,因为图像是黑白的,我希望轮廓是红色的。
这里是我开始使用RGB(彩色斑点检测的,不是黑白图像)。注意未检测到小斑点。 (有可能检测到它们吗?还是它们太小?)
感谢您的帮助!如果您需要更多的信息,我会很乐意更新这个问题
UPDATE:彩色斑点检测样品(第二图像)
GitHub Repo of openCV sample for Android
你好,你的问题是相当不提供信息。请上传输入图像以及您的处理过程。这将有助于理解这个问题。作为一个例子,看到这个问题:http://stackoverflow.com/q/10168686/1874627 – saurabheights
@saurabheights感谢您的评论。我会用更多的信息和代码片段更新这个问题 – sebasira
好吧,我可以建议的东西很少。只要有一个很好的对比,不管小的还是大的斑点都不应该成为问题。如果您可以找到大多数像素为白色的区域(检查连接的组件),您将获得纸张区域。如果你发现一个子区域是黑色的(低于纸张区域的平均强度),你会发现所有的斑点。要绘制轮廓,您需要找到黑色区域的凸包。另外,您是否可以上传代码(或链接到它)以获取第二个图像输出的实现方式。这里迟到了,明天再检查一下。感谢您的更新。 – saurabheights