簡體   English   中英

ANDROID - 使用openCV進行顏色檢測 - 如何操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM