2012-02-25 36 views
8

Mục tiêu của tôi là hiển thị hình ảnh đập bằng không gian màu HSV theo cách mà chỉ các vật thể màu vàng mới được hiển thị. tôi sử dụng mã này (dựa trên một mã số được đưa ra bởi OpenCV 2.3.1 mẫu android):ANDROID - dò tìm màu bằng cách sử dụng openCV - cách thực hiện?

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; 
} 

cơ sở (Tóm tắt) lớp chứa "chạy" phương pháp:

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); 
... 
} 

tôi có được điều này méo hình xem trước mà tôi nghĩ rằng tôi có thể hiểu (định dạng HSV) nhưng tại sao nó lặp lại chính nó (i`v vẽ một đường màu xanh lá cây để nhấn mạnh nó) 4 thời gian? và đường ngang màu đen là gì? enter image description here tôi đang làm gì sai?

một điều cuối cùng, những gì là logic đằng sau:

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

tại sao nó COLOR_RGB2HSV? không nên là COLOR_HSV2RGB?

Giả sử tôi đã vượt qua vấn đề này, làm cách nào tôi có thể tạo hình ảnh mức xám với các đối tượng màu vàng trong màu gốc? tôi nghĩ rằng bằng cách sử dụng phương pháp Core.inRange() nhưng khi tôi làm điều này tôi nhận được màn hình màu đen.

vâng, tôi đoán tôi trông giống như tổng số giật nhưng tôi cần phải bắt đầu từ đâu đó, phải không?

10x!

Cập nhật 1: tôi đã cố gắng để làm RGB-> HSV-> RGB theo cách này:

@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; 
} 

và tôi đã nhận: enter image description here

?

Cập nhật 2:

tôi cuối cùng cũng hiểu rằng trước khi thiết lập một khung hình, nó phải được chuyển đổi thành RGB Một không gian. vì vậy bây giờ tôi đã thử ngưỡng với mã như sau:

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); 

nhưng bây giờ nó cho tôi tắt máy ... bất kỳ ý tưởng nào?

+1

Tôi biết cách đây một thời gian và đó không phải là cách chính xác để hỏi - nhưng bạn đã thực hiện hướng dẫn về điều này chưa? như tôi không thể có được VideoCapture làm việc tôi sẽ được vui mừng nếu bạn có thể cung cấp mã của bạn - hoặc các phần của mã của bạn tại github. Cảm ơn Big – user1651460

+2

Xin chào! Tôi thực sự xin lỗi nhưng nó đã được một thời gian kể từ khi i'v làm việc với openCV, Plus tôi không có mã nữa. Tôi khuyên bạn nên xem tại đây: http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html#videowritehighgui. Chúc may mắn, công việc khó khăn trả tiền cuối cùng :) – gor

Trả lời

5

Tôi nghĩ mHSVThreshed là một mat nhị phân

như vậy có lẽ dòng này:

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

nên thay đổi để:

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

tôi đã dành rất nhiều thời gian đối phó với "hiển thị" proble m quá ...

hy vọng sự trợ giúp này ...

+0

תודה. מה ניסת לעשות? – gor

+0

Hey tôi muốn thêm một ma trận trên phần được đánh dấu trong hình ảnh, bạn có thể hướng dẫn tôi không? –

+0

Loại ma trận nào? Bạn có nghĩa là vẽ một cái gì đó trên nó như AR? –

1

tại sao lại là COLOR_RGB2HSV? không nên là COLOR_HSV2RGB?

Tôi sẽ nói rằng nó nên :). Trông giống như một vấn đề về cách opencv lấy các điểm ảnh. Kiểm tra xem cả hình ảnh đầu vào và đầu ra của bạn có cùng kích thước và số kênh hay không.

này

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 

cũng có vẻ lạ với tôi, có bạn lưu trữ các hình ảnh RGBA mà bạn nhận được vào một hình ảnh ở định dạng HSV? Điều đó sẽ giải thích được vấn đề. Hãy thử làm một việc như thế: RGB (chụp lấy) => HSV (màu cvt) => phát hiện màu => RGB (màu cvt một lần nữa)

+0

tôi biết nó có vẻ có dây nhưng khi tôi thử chuyển đổi: capture.retrieve (mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); Imgproc.cvtColor (mRgba, mHSV, Imgproc.COLOR_HSV2RGB_FULL, 4); nó không hoạt động ... – gor

2

Chừng nào tôi thấy bạn lấy khung hình trong RGBA và lưu nó dưới cái tên "mHSV"

capture.retrieve(mHSV, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

vì vậy bạn nên có lưu nó như mRgba

trong cvtColor bạn cần phải chuyển đổi nó để HSV qua COLOR_RGBA2HSV. Giả sử bạn đã thay đổi tên này sẽ là:

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

Và tôi giả sử lặp lại này của hình ảnh xuất phát từ "4" trong bạn cvtColor chức năng từ hình ảnh HSV của bạn sẽ chỉ có 3 kênh. Đặt trong một 0 ở đó và nó phải được phát hiện tự động ...

Tôi hy vọng nó sẽ giúp ...

+0

Hey, chính xác những gì tôi có ý nghĩa, nhưng với lời giải thích tốt hơn: p – jlengrand

+0

10x guys. i'll hãy thử xem .. – gor

+0

i'v đã cập nhật Bài đăng, bạn nên kiểm tra xem nó .. – gor

15

bạn bè. tôi cung cấp cho bạn kết quả của 1 tháng làm việc chăm chỉ và giúp đỡ bạn bè trên khắp đại dương: enter image description here

Ethan đã đúng. nhưng mã cần một số sửa chữa.

mã:

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))... 

đầu tiên, mat là nhị phân 0 hoặc 255 nên chuyển sang màu xám cấp độ là "tự nhiên". thứ hai, việc chuyển đổi từ HSVto RGBis thành HSV-BGR !! và điều cuối cùng là bản xem trước dự kiến ​​là bitmap RGBA.

thats it. hy vọng khác có thể hưởng lợi từ bài đăng này. SHALOM!

+0

Kudo, đây là một trợ giúp tuyệt vời! – octopi

+0

tuyệt vời! vui mừng tôi quản lý để giúp bạn .. – gor

+0

@gor bạn có thể vui lòng thêm các giá trị của mRgba, mHSV, mHSVThreshed, mRgba2? – dvrm

Các vấn đề liên quan