2012-06-22 31 views
7

Tôi sẽ tránh chuyển đổi từng khung hình được quay bằng máy quay video với cvtColor(frame, image, CV_RGB2GRAY);
Có cách nào để đặt VideoCapture để nhận trực tiếp trong thang độ xám không?opencv VideoCapture.set greyscale?

Ví dụ:

VideoCapture cap(0); 

cap.set(CV_CAP_PROP_FRAME_WIDTH,420); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT,340); 
cap.set(CV_CAP_GREYSCALE,1); //< ??? 

Trả lời

3

này là không thể. Dưới đây là danh sách tất cả các mã:

CV_CAP_PROP_POS_MSEC - position in milliseconds from the file beginning 
CV_CAP_PROP_POS_FRAMES - position in frames (only for video files) 
CV_CAP_PROP_POS_AVI_RATIO - position in relative units (0 - start of the file, 1 - end of the file) 
CV_CAP_PROP_FRAME_WIDTH - width of frames in the video stream (only for cameras) 
CV_CAP_PROP_FRAME_HEIGHT - height of frames in the video stream (only for cameras) 
CV_CAP_PROP_FPS - frame rate (only for cameras) 
CV_CAP_PROP_FOURCC - 4-character code of codec (only for cameras). 

Hoặc (nếu có thể, sử dụng một số tiện ích) bạn có thể thiết lập máy ảnh để chỉ hiển thị hình ảnh màu xám.

Để chuyển đổi hình ảnh màu thành màu xám, bạn phải gọi cvtColor bằng mã CV_BGR2GRAY. Điều này không mất nhiều thời gian.

+2

Chuyển đổi màu sắc chắc chắn không phải là vấn đề lớn trong OpenCV trừ khi bạn đang sử dụng các hệ thống nhúng trong đó sức mạnh của CPU là rất quan trọng và cvtColor trong mỗi vòng lặp có thể làm cho khung hình bị hỏng. Giống như với Raspberry Pi. – Void

+0

Điều này không hoàn toàn đúng, hãy xem câu trả lời của tôi. –

6

Nếu máy ảnh của bạn hỗ trợ YUV420 sau đó bạn chỉ có thể kéo dài kênh Y: http://en.wikipedia.org/wiki/YUV

Làm thế nào để làm điều đó được giải thích tốt ở đây: Access to each separate channel in OpenCV

Cảnh báo: kênh Y có thể không phải là Mat đầu tiên bạn nhận được với split() vì vậy bạn nên làm một imshow() của tất cả chúng một cách riêng biệt và chọn một trong đó trông giống như hình ảnh màu xám "thực". Những người khác sẽ chỉ được waaaay ra tương phản vì vậy nó sẽ được rõ ràng. Đối với tôi đó là tấm thảm thứ hai.

Thông thường, mọi máy ảnh sẽ có thể thực hiện YUV420 vì việc gửi khung trực tiếp trong RGB chậm hơn nên YUV được sử dụng khá nhiều bởi gần như mọi camera. :)

+0

Trên thực tế, việc truy xuất khung trên YUV và chuyển đổi sang thang xám có khá nhiều chi phí CPU giống như sử dụng hàm spit() để chỉ hoạt động trên kênh Y. Tôi có thể thấy giảm 3% sử dụng CPU khi sử dụng chức năng chia tách thay vì cvtColor (trên vỏ ARM ARM A9 1.1 ghz) –

3

Điều này là không thể nếu bạn sử dụng v4l (phương pháp chụp cv mặc định trên máy tính để bàn Linux). CV_CAP_PROP_FORMAT tồn tại nhưng chỉ bị bỏ qua. Bạn phải chuyển đổi hình ảnh thành màu xám theo cách thủ công. Nếu thiết bị của bạn hỗ trợ nó, bạn có thể muốn thực hiện lại cap_v4l.cpp để giao diện v4l để đặt định dạng thành thang độ xám.

Trên Android này có thể với mã nguồn gốc sau (đối với thiết bị 0):

#include<opencv2/highgui/highgui.hpp> 
#include<opencv2/highgui/highgui_c.h> 

cv::VideoCapture camera(0); 
camera->open(0); 
cv::Mat dest(480,640,CV_8UC1); 
if(camera->grab()) 
    camera->retrieve(dest,CV_CAP_ANDROID_GREY_FRAME); 

Ở đây, đi qua CV_CAP_ANDROID_GREY_FRAME đến channel tham số của cv::VideoCapture::retrieve(cv::Mat,int) làm cho YUV NV21 (aka yuv420sp) hình ảnh là màu được chuyển đổi thành thang độ xám. Đây chỉ là ánh xạ kênh Y với hình ảnh thang độ xám, không liên quan đến bất kỳ chuyển đổi thực tế nào hoặc memcpy, do đó rất nhanh. Bạn có thể kiểm tra hành vi này trong https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L407 và "chuyển đổi màu" trong https://github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp#L511. Tôi đồng ý rằng hành vi này không phải là tài liệu ở tất cả và rất khó xử, nhưng nó đã tiết kiệm rất nhiều thời gian CPU cho tôi.