[英]ANDROID - color detection using openCV - how to?
我的目標是使用HSV顏色空間顯示一個脫粒的圖像,只顯示黃色對象。 我使用此代碼(基於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;
}
base(Abstract)類包含“run”方法:
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 A空間。 所以我現在嘗試使用以下代碼的閾值:
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);
但現在它讓我強制關閉......任何想法?
朋友。 我給你一個月的辛勤工作和海洋朋友的幫助結果:
伊桑是對的。 但代碼需要一些修復。
代碼:
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到RGB的轉換實際上是HSV-BGR !! 最后一點是預覽是期待RGBA位圖。
而已。 希望其他人可以從這篇文章中受益。 SHALOM!
我認為mHSVThreshed是一個二元墊
也許這一行:
Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_HSV2RGB, 0);
應改為:
Imgproc.cvtColor(mHSVThreshed, mRgba, Imgproc.COLOR_GRAY2RGB, 0);
我花了很多時間處理“顯示”問題......
希望這有幫助......
就我所見,你在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如何抓取像素的問題。 檢查輸入和輸出圖像的大小和通道數是否相同。
這個
capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
對我來說看起來也很奇怪,你是否將你得到的RGBA圖像存儲在HSV格式的圖像中? 這可以解釋這個問題。 嘗試做類似的事情:RGB(捕獲檢索)=> HSV(cvt顏色)=>顏色檢測=> RGB(cvt顏色再次)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.