android蓝色的代码,android – 尝试使用opencv从图像中检测蓝色...

我是OpenCV4Android的新手.这是我编写的一些代码,用于检测图像中的蓝色斑点.在下面的图像中,图像1在我的笔记本电脑中.我运行应用程序,OpenCV摄像头捕获的帧是图像2.您可以查看代码以查看其余图像是什么. (正如您在代码中看到的,所有图像都保存在SD卡中.)

我有以下问题:

>为什么在相机捕获的rgba帧中,浅蓝色斑点的颜色变成浅黄色(如图2所示).

>我在最大的蓝色blob周围创建了一个boundingRect,然后通过执行rgbaFrame.submat(detectedBlobRoi)创建了ROI.但是你可以在最后一张图片中看到它看起来像几个灰色像素.我期待蓝色球体与图像的其余部分分开.

我错过了什么或做错了什么?

码:

private void detectColoredBlob () {

Highgui.imwrite("/mnt/sdcard/DCIM/rgbaFrame.jpg", rgbaFrame);//check

Mat hsvImage = new Mat();

Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_RGB2HSV_FULL);

Highgui.imwrite("/mnt/sdcard/DCIM/hsvImage.jpg", hsvImage);//check

Mat maskedImage = new Mat();

Scalar lowerThreshold = new Scalar(170, 0, 0);

Scalar upperThreshold = new Scalar(270, 255, 255);

Core.inRange(hsvImage, lowerThreshold, upperThreshold, maskedImage);

Highgui.imwrite("/mnt/sdcard/DCIM/maskedImage.jpg", maskedImage);//check

Mat dilatedMat= new Mat();

Imgproc.dilate(maskedImage, dilatedMat, new Mat() );

Highgui.imwrite("/mnt/sdcard/DCIM/dilatedMat.jpg", dilatedMat);//check

List contours = new ArrayList();

Imgproc.findContours(dilatedMat, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

//Use only the largest contour. Other contours (any other possible blobs of this color range) will be ignored.

MatOfPoint largestContour = contours.get(0);

double largestContourArea = Imgproc.contourArea(largestContour);

for ( int i=1; i

MatOfPoint currentContour = contours.get(0);

double currentContourArea = Imgproc.contourArea(currentContour);

if (currentContourArea > largestContourArea) {

largestContourArea = currentContourArea;

largestContour = currentContour;

}

}

Rect detectedBlobRoi = Imgproc.boundingRect(largestContour);

Mat detectedBlobRgba = rgbaFrame.submat(detectedBlobRoi);

Highgui.imwrite("/mnt/sdcard/DCIM/detectedBlobRgba.jpg", detectedBlobRgba);//check

}

>计算机中的原始图像,这是通过将手机的相机放在笔记本电脑屏幕前面拍摄的.

bdb06f18181f483280b172c2291ca466.png

> rgbaFrame.jpg

f60b7a36b44c17ed9f5e8b08c938aa46.png

> hsvImage.jpg

QkvpJ.jpg

> dilatedImage.jpg

d94fbbcc96cd3b23b12f482201b6efbc.png

> maskedMat.jpg

2f8c37751692bf2e8eea3a8db5439624.png

> detectedBlobRgba.jpg

N32C6.jpg

编辑:

我刚刚使用了Core.inRange(hsvImage,新Scalar(0,50,40),新Scalar(10,255,255),maskedImage); // 3,217,225 — 6,85.09,88.24 …… 3 219 255,我通过给它一个红色的自定义HSV值,即对于OpenCV红色标量(3,217,255)(它落在给定的inRange函数中设置的范围内)捕获了网站colorizer.org的screeshot ,我将通道值缩放到colorizer.org的比例,即H = 0-360,S = 0-100,V = 0-100,通过将H值乘以2,并将S和V值除以255,然后乘以100.这给了我在网站上设置的6,85.09,88.24,并截取了屏幕截图(下图中的第一个).

>原始截图,我抓住了这个框架.

359080b0319e01d16990af277c4cbdf0.png

> rgbaFrame.jpg

xbu6p.jpg

> hsvImage.jpg

d5752276d7496253c36d8452bfa3ef4f.png

> maskedImage.jpg

a5029ee82202900087efed996d60e34a.png

> dilatedMat.jpg

54455a6e3ee13a7954142845ddfbce60.png

> detectedBlobRgba.jpg

d19cace9ef825e6bd1992492ba04fed3.png

重要:

当我触摸rgbaFrame(即在onTouch方法中调用它)时,实际上在我的测试应用程序中调用给定的方法.我还使用以下代码将TextI中已触摸的彩色blob的Hue,Saturation和Value值打印到TextView.当我运行这个应用程序时,我触摸了红色blob,并得到以下值:Hue:3,Saturation:219,Value:255.

public boolean onTouch(View v,MotionEvent motionEvent){

????detectColoredBlob();

????int cols = rgbaFrame.cols();

????int rows = rgbaFrame.rows();

int xOffset = (openCvCameraBridge.getWidth() - cols) / 2;

int yOffset = (openCvCameraBridge.getHeight() - rows) / 2;

int x = (int) motionEvent.getX() - xOffset;

int y = (int) motionEvent.getY() - yOffset;

Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")");//check

if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) { return false; }

Rect touchedRect = new Rect();

touchedRect.x = (x > 4) ? x - 4 : 0;

touchedRect.y = (y > 4) ? y - 4 : 0;

touchedRect.width = (x + 4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x;

touchedRect.height = (y + 4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y;

Mat touchedRegionRgba = rgbaFrame.submat(touchedRect);

Mat touchedRegionHsv = new Mat();

Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL);

double[] channelsDoubleArray = touchedRegionHsv.get(0, 0);//**********

float[] channelsFloatArrayScaled = new float[3];

for (int i = 0; i < channelsDoubleArray.length; i++) {

if (i == 0) {

channelsFloatArrayScaled[i] = ((float) channelsDoubleArray[i]) * 2;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper

} else if (i == 1 || i == 2) {

channelsFloatArrayScaled[i] = ((float) channelsDoubleArray[i]) / 255;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper

}

}

int androidColor = Color.HSVToColor(channelsFloatArrayScaled);

view.setBackgroundColor(androidColor);

textView.setText("Hue : " + channelsDoubleArray[0] + "

Saturation : " + channelsDoubleArray[1] + "

Value : "

+ channelsDoubleArray[2]);

touchedRegionHsv.release();

return false; // don't need subsequent touch events

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值