मुझे कुछ परेशानी हो रही है क्योंकि मैं अपने सी ++ प्रोजेक्ट में ओपनसीवी 3.x से 4.x (स्रोत से संकलित) में बदल गया हूं। मैंने इस व्यवहार को एक छोटे से उदाहरण में दोहराया है जो सिर्फ एक वेब कैमरा खोलता है और 5 सेकंड के लिए रिकॉर्ड करता है।

3.x के साथ मैं पूर्ण HD पर वेबकैम फ्रैमरेट को 30 पर सेट करने में सक्षम हूं, लेकिन 4.x के साथ समान कोड केवल camera.set(cv::CAP_PROP_FPS,30) को अनदेखा करता है और इसके बजाय इसे 5 पर सेट करता है। अगर मैं 720p का उपयोग करता हूं, तो fps को 10 पर सेट किया जाता है।

हो सकता है कि कोड यहां प्रासंगिक नहीं है, क्योंकि यह एक शास्त्रीय उदाहरण है, लेकिन अगर मैं इसे यहां छोड़ दूं।

#include "opencv2/opencv.hpp"
#include "iostream"
#include "thread"
#include <unistd.h>

using namespace cv;

VideoCapture camera(0);
bool stop = false;
int fc = 0;

void saveFrames()
{
    while(!stop)
    {
        Mat frame;
        camera >> frame;
        cv::imwrite("/tmp/frames/frame" + std::to_string(fc) + ".jpg", frame);
        fc++;
    }
}

int main()
{
    if(!camera.isOpened())
        return -1;

    camera.set(cv::CAP_PROP_FRAME_WIDTH,1920);
    camera.set(cv::CAP_PROP_FRAME_HEIGHT,1080);
    camera.set(cv::CAP_PROP_FPS,30);

    double fps = camera.get(cv::CAP_PROP_FPS);
    std::cout << "FPS setting: " << fps << std::endl; // 5 with OCV4, 30 with OCV3

    std::thread tr(saveFrames);
    int waitSeconds = 5;
    usleep(waitSeconds * 1e6);
    stop = true;
    tr.join();

    std::cout << "Written " << fc << " frames of " << fps * waitSeconds << std::endl;
    return 0;
}

संपादित करें: अन्य कंप्यूटरों के साथ अधिक परीक्षण मैकबुक प्रो (लेकिन समान वितरण चलाने) को छोड़कर समान परिणाम देते हैं जहां ओपनसीवी 4.3 काम करता प्रतीत होता है। अन्य 2 कंप्यूटर यूएसबी वेबकैम वाले डेस्कटॉप हैं।

संपादित करें 2: स्रोत कोड से संस्करण 3.4 भवन के साथ एक ही समस्या। अभी के लिए, रेपो से केवल 3.2 दो कंप्यूटरों में usbcams के साथ ठीक काम करता है।

6
dvilela 1 जून 2020, 14:18

1 उत्तर

सबसे बढ़िया उत्तर

यह एक ज्ञात बग है जो OpenCV > 3.3 को प्रभावित करता है

1
dvilela 1 जून 2020, 15:13