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ì? 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:
?
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?
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
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