2017-10-06 96 views
5

Tôi có máy ảnh từ hệ thống e-con hỗ trợ ghi video codec UYVU. Khi tôi sử dụng phần mềm riêng của họ (QTCam) để ghi lại một video nó ghi lại ở định dạng avi với YUY2 Codec, mà video mở và chạy trong VLC hoàn hảo.Ghi video trong bộ mã hóa UYVY trong Opencv

enter image description here

Bây giờ tôi cố gắng ghi lại những đoạn video thông qua OpenCV VideoWrtiter(). Tôi đã sử dụng lệnh này để đặt thuộc tính Camera để đọc video Codec UYVY.

camera1.set(CV_CAP_PROP_FOURCC,CV_FOURCC('U','Y','V','Y')); 

và cũng dùng VideoWriter để quay video ở định dạng tệp AVI.

video1.open("/home/camera1UYVY.avi",CV_FOURCC('Y','U','Y','2'),30,s1,true); 

Nguồn cấp dữ liệu từ máy ảnh đang hoạt động, tôi đã kiểm tra bằng imshow(). Nhưng video được ghi lại không phát trong VLC vì nó hoạt động cho video được ghi lại từ QTCam.

Ngay cả những opencv recoded ghi có các codec cùng

enter image description here

Mã của tôi đi dưới

#include <opencv2/core/core.hpp> 
#include <opencv2/video/video.hpp> 
#include <opencv2/imgcodecs/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/videoio/videoio.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

int main(int argc, char **argv) { 

VideoCapture camera1; 
Mat frame1; 

camera1.open(0); 

camera1.set(CV_CAP_PROP_FOURCC,CV_FOURCC('U','Y','V','Y')); 


camera1.set(CV_CAP_PROP_FRAME_WIDTH,1280); 
camera1.set(CV_CAP_PROP_FRAME_HEIGHT,720); 



cout << "FPS:" << camera1.get(CV_CAP_PROP_FPS) << endl; 

camera1.set(CV_CAP_PROP_FPS,30); 

cout << "FPS:" << camera1.get(CV_CAP_PROP_FPS) << endl; 

cout << "Camera -1 Codec: " << (int)camera1.get(CV_CAP_PROP_FOURCC) << endl; 


VideoWriter video1; 

cout << camera1.get(CV_CAP_PROP_FRAME_WIDTH) << endl; 
cout << camera1.get(CV_CAP_PROP_FRAME_HEIGHT) << endl; 
Size s1 = Size((int)camera1.get(CV_CAP_PROP_FRAME_WIDTH),(int)camera1.get(CV_CAP_PROP_FRAME_HEIGHT)); 


video1.open("/home/camera1UYVY.avi",CV_FOURCC('Y','U','Y','2'),30,s1,true); 


while(!camera1.isOpened()){ 
    cout << "Camera not opened" << endl; 
    continue; 
} 
while(1){ 

    if(!video1.isOpened()){ 
     cout << "Error opening video" << endl; 
    } 
    camera1.read(frame1); 
    imshow("Display1",frame1); 
    video1.write(frame1); 
    cout << frame1.data << endl; 
    if(waitKey(1) == 27){ 
     break; 
    } 
} 
video1.release(); 
camera1.release(); 
return 0; 

} xin vui lòng cho tôi biết nơi tôi sẽ sai. Tôi muốn quay video không nén từ máy ảnh và lưu video dưới dạng tệp video (mở trong VLC hoặc bất kỳ trình phát video nào khác)

+0

Không chắc chắn nếu tôi hiểu điều này - nhưng tôi không có chuyên gia về video. Dường như bạn đang đọc dữ liệu 'UYVY' và ghi chính xác dữ liệu chưa sửa đổi và đột nhiên xác nhận đó là' YUY2' ...? –

+0

Thực ra, tôi đang đọc dữ liệu UYVY và ghi vào tệp Avi bằng UYVY và cũng sử dụng codec YUV2. Cả hai đều cho kết quả tương tự. Nó không phát trên bất kỳ trình phát đa phương tiện nào. –

+0

Tôi sẽ bắt đầu bằng cách kiểm tra những gì '' CAP_PROP_FORMAT'' và '' CAP_PROP_CONVERT_RGB'' được đặt thành. – zeFrenchy

Trả lời

5

OpenCV dường như có sự cố khi viết định dạng yuv422p thành avi. Hãy thử điều này thay vì:

video1.open("/home/camera1UYVY.avi",CV_FOURCC('I', 'Y', 'U', 'V'),30,s1,true); 

Đây là một định dạng pixel yuv420p, có nghĩa là bạn mất một số chính xác trong dọc máy bay U và V, nhưng nó vẫn sẽ là video không nén.

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