Android OpenCV:颜色检测给出奇怪的结果
Posted
技术标签:
【中文标题】Android OpenCV:颜色检测给出奇怪的结果【英文标题】:Android OpenCV: color detection giving weird result 【发布时间】:2017-08-10 07:49:51 【问题描述】:我刚刚学会了如何从OpenCV Java, Getting region of interest from image 中检测颜色。
最后,我想知道如何检测 AA 电池(带或不带黑色胶带)
我现在正在尝试检测图片中的电池,但电池并没有完全变黑,这反过来又给了我奇怪的结果:
我用黑色胶带盖住电池并再次尝试,结果似乎更好,但它在两个单独的部分检测电池:
代码:
private Bitmap findRoiBlack(Bitmap sourceBitmap)
Bitmap roiBitmap = null;
Scalar green = new Scalar(0, 255, 0, 255);
Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3);
Utils.bitmapToMat(sourceBitmap, sourceMat);
Mat roiTmp = sourceMat.clone();
final Mat hsvMat = new Mat();
sourceMat.copyTo(hsvMat);
// convert mat to HSV format for Core.inRange()
Imgproc.cvtColor(hsvMat, hsvMat, Imgproc.COLOR_RGB2HSV);
Scalar lowerb = new Scalar(0, 0, 0); // lower color border for BLACK
Scalar upperb = new Scalar(180, 255, 30); // upper color border for BLACK
//Scalar lowerb = new Scalar(0, 0, 200); // lower color border for WHITE
//Scalar upperb = new Scalar(180, 255, 255); // upper color border for WHITE
Core.inRange(hsvMat, lowerb, upperb, roiTmp); // select only blue pixels
// find contours
List<MatOfPoint> contours = new ArrayList<>();
List<RotatedRect> boundingRects = new ArrayList<>();
Imgproc.findContours(roiTmp, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
// find appropriate bounding rectangles
for (MatOfPoint contour : contours)
MatOfPoint2f areaPoints = new MatOfPoint2f(contour.toArray());
RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints);
double rectangleArea = boundingRect.size.area();
// test min ROI area in pixels
if (rectangleArea > 400)
Point rotated_rect_points[] = new Point[4];
boundingRect.points(rotated_rect_points);
Rect rect = Imgproc.boundingRect(new MatOfPoint(rotated_rect_points));
// test vertical ROI orientation
if (rect.height > rect.width)
Imgproc.rectangle(sourceMat, rect.tl(), rect.br(), green, 3);
roiBitmap = Bitmap.createBitmap(sourceMat.cols(), sourceMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(sourceMat, roiBitmap);
return roiBitmap;
【问题讨论】:
【参考方案1】:最简单的方法 - 为电池添加颜色标记。其他方式是为您的安装的垂直通道设置坚实、可区分的背景(甚至可能是背光 - 在这种情况下,您应该在白色/高亮度背景上找到黑色/低亮度物体)。如果不可能并且您有纯色背景-尝试“反转”方法:不要尝试查找电池(因为它有多种颜色)-查找背景(因为它只有一种纯色)-可能具有“非背景”颜色的对象电池(并且您还有其他提示:电池是比例为 1/4 的“垂直”矩形)(AAA 电池的直径为 10.5 毫米,长度为 44.6 毫米),它大约位于图像的垂直中心,并且上面有镀铬的高亮度元素顶部和底部等)。
【讨论】:
以上是关于Android OpenCV:颜色检测给出奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章