2017-10-06 19 views
5

में यूवायवी कोडेक में रिकॉर्डिंग वीडियो मेरे पास ई-कॉन सिस्टम से एक कैमरा है जो यूवायवीयू कोडेक वीडियो रिकॉर्डिंग का समर्थन करता है। जब मैं एक वीडियो रिकॉर्ड करने के लिए अपने स्वयं के सॉफ़्टवेयर (क्यूटीसीएएम) का उपयोग करता हूं तो यह वाईयूवाई 2 कोडेक के साथ एवी प्रारूप में रिकॉर्ड करता है, जिसे वीडियो खुलता है और वीएलसी में पूरी तरह से चलता है।ओपनसीवी

enter image description here

अब मैं OpenCV VideoWrtiter के माध्यम से वीडियो रिकॉर्डिंग की कोशिश की()। मैंने UYVY कोडेक वीडियो पढ़ने के लिए कैमरा प्रॉपर्टी सेट करने के लिए इस कमांड का उपयोग किया था।

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

और वीडियो एवीआई फ़ाइल प्रारूप में वीडियो रिकॉर्ड करने के लिए वीडियोवाइटर का भी उपयोग किया।

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

कैमरा से फ़ीड काम कर रही है, मैंने imshow() के साथ जांच की है। लेकिन रिकर्ड वीडियो वीएलसी में नहीं खेल रहा है क्योंकि यह क्यूटीसीएएम से दर्ज एक के लिए काम करता है।

भी recoded opencv दर्ज की गई एक ही कोडेक

enter image description here

मेरे कोड

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

} नीचे चला जाता है कृपया मुझे बताओ मैं कहाँ गलत जा रहा हूँ है। मैं कैमरे से एक असम्पीडित वीडियो रिकॉर्ड करना चाहता हूं और इसे एक वीडियो फ़ाइल (जो वीएलसी या किसी अन्य वीडियो प्लेयर में खुलता है) के रूप में सहेजना चाहता है

+0

सुनिश्चित नहीं है कि मैं इसे समझता हूं - लेकिन मैं वीडियो पर कोई विशेषज्ञ नहीं हूं। आप 'UYVY' डेटा पढ़ रहे हैं और सटीक उसी असम्बद्ध डेटा लिख ​​रहे हैं और अचानक दावा करते हैं कि यह 'YUY2' है ...? –

+0

दरअसल, मैं UYVY डेटा पढ़ रहा हूं और UYVY का उपयोग करके और यूयूवी 2 कोडेक का उपयोग करके एवी फ़ाइल में लिख रहा हूं। दोनों ने एक ही परिणाम दिया। यह किसी भी मीडिया प्लेयर पर नहीं खेलता है। –

+0

मैं यह जांच कर शुरू करूंगा कि 'CAP_PROP_FORMAT'' और' 'CAP_PROP_CONVERT_RGB'' क्या सेट हैं। – zeFrenchy

उत्तर

5

ओपनसीवी में एवी के लिए yuv422p प्रारूप लिखने में कोई समस्या है। ऐसा करें:

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

यह एक yuv420p पिक्सेल प्रारूप, जिसका अर्थ है आप खड़ी यू और वी विमानों में कुछ सटीक खो देते हैं, लेकिन यह अभी भी असम्पीडित वीडियो हो जाएगा।