ANDROID – 使用openCV进行颜色检测 – 如何?

我的目标是使用HSV颜色空间显示一个只有黄色对象将显示一个threshed图像。 我使用这个代码(基于openCV 2.3.1 android样本给出的代码):

protected Bitmap processFrame(VideoCapture capture) { //capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); //Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4); //Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba); Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); if (Utils.matToBitmap(mRgba, bmp)) return bmp; bmp.recycle(); return null; } 

基(抽象)类包含“运行”方法:

 protected abstract Bitmap processFrame(VideoCapture capture); public void run() { ... bmp = processFrame(mCamera); ... canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null); ... } 

我得到这个扭曲的预览,我认为我可以理解(HSV格式),但为什么它重复自己(我是画一条绿线来强调它)4次? 黑色的水平线是什么? 在这里输入图像说明 我究竟做错了什么?

最后一件事,背后的逻辑是什么:

 Imgproc.cvtColor(mHSV, mRgba, Imgproc.COLOR_RGB2HSV, 4); 

为什么是COLOR_RGB2HSV? 不应该是COLOR_HSV2RGB?

假设我已经通过了这个问题,我怎样才能用黄色的物体制作一个灰度图像呢? 我想使用Core.inRange()方法,但是当我这样做,我得到黑屏。

是的,我想我看起来像一个混蛋,但我需要从某个地方开始,不是吗?

10倍!

更新1:我试图这样做RGB-> HSV-> RGB:

  @Override protected Bitmap processFrame(VideoCapture capture) { //capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); //Imgproc.cvtColor(mGray, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB); Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0); //Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_BGR2RGB, 4); //Core.inRange(mRgba, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mRgba); Imgproc.cvtColor(mHSV,mRgba , Imgproc.COLOR_HSV2RGB,0); Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); if (Utils.matToBitmap(mRgba, bmp)) return bmp; bmp.recycle(); return null; } 

我得到了: 在这里输入图像说明

更新2:

我终于明白,在设置一个框架之前,它必须被转换成RGB空间。 所以我现在尝试与代码的门槛如下:

 capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_RGB2HSV,0); Core.inRange(mHSV, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mHSVThreshed); Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0); Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 0); Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 

但现在它让我强制closures…任何想法?

Solutions Collecting From Web of "ANDROID – 使用openCV进行颜色检测 – 如何?"

我认为mHSVThreshed是一个二进制的mat

所以也许这一行:

 Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0); 

应改为:

 Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_GRAY2RGB, 0); 

我也花了很多时间处理“显示”问题。

希望这个帮助…

朋友。 我给你1个月的辛勤工作和来自海洋的朋友的帮助: 在这里输入图像说明

Ethan说得对。 但代码需要一些修复。

代码:

  capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_BGRA); Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_BGR2HSV,3); Core.inRange(mHSV, new Scalar(0, 100, 30), new Scalar(5, 255, 255), mHSVThreshed); Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_GRAY2BGR, 0); Imgproc.cvtColor(mRgba, mRgba2, Imgproc.COLOR_BGR2RGBA, 0); Bitmap bmp = Bitmap.createBitmap(mRgba2.cols(), mRgba2.rows(), Bitmap.Config.ARGB_8888); if (Utils.matToBitmap(mRgba2, bmp))... 

首先,mat是二进制0或255,所以灰度级的转换更“自然”。 第二,从HSV到RGBis的转换实际上是HSV-BGR !! 最后一点是预览期望RGBA位图。

而已。 希望其他可以从这个post中受益。 SHALOM!

那么据我所见,你可以在RGBA中获取图像帧,并将其保存在名称“mHSV”

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

所以你应该在那里存储它作为mRgba

在cvtColor中,您需要通过COLOR_RGBA2HSV将其转换为HSV。 假设你已经改变了这个名字:

 Imgproc.cvtColor(mRgba, mRSV, Imgproc.COLOR_RGB2HSV, 0); 

我认为这个图像的重复来自于你的cvtColor函数中的“4”,因为你的HSV图片只有3个通道。 把0放在那里,它应该被自动检测…

我希望这有助于…

为什么是COLOR_RGB2HSV? 不应该是COLOR_HSV2RGB?

我会说,它应该:)。 看起来像opencv如何抓住像素的问题。 检查您的input和输出图像是否具有相同的大小和通道数量。

这个

 capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

看起来也很奇怪,你是否存储在HSV格式的图像的RGBA图像? 这将解释这个问题。 试着做这样的事情:RGB(capture retrieve)=> HSV(cvt color)=> color detection => RGB(cvt color again)