尝试在C++中使用OpenCV从灰度相机渲染图像.几帧后就挂了

Trying to render image from grayscale camera with OpenCV in C++. Hangs after a few frames

本文关键字:图像 几帧 C++ 相机 灰度 OpenCV      更新时间:2023-10-16

我有一个灰度相机(NOT COLOR),正在尝试渲染图像。我在Raspbian上运行,在Raspberry Pi 2上运行。我已经掌握了一些代码,并将其暴露在最低限度,并取得了一些进展:

    #include "opencv2/opencv.hpp"
    #include <iostream>
    using namespace cv;
    using namespace std;
    int main(int, char**)
    {
        VideoCapture cap(0); // open the default camera
        if(!cap.isOpened())  // check if we succeeded
            return -1;
        bool rtn;
//        rtn = cap.set(CV_CAP_PROP_FRAME_WIDTH , 752);
//        cout << "set to 752:" << rtn << endl;
//        rtn = cap.set(CV_CAP_PROP_FRAME_HEIGHT , 480);
//        cout << "set to 480:" << rtn << endl;
        int count = 1;
        Mat edges;
        namedWindow("edges",1);
        for(;;)
        {
            Mat frame;
            cap >> frame; // get a new frame from camera
            cout << "cols:" <<frame.cols << endl;
            cout << "rows:" << frame.rows << endl;
            cout << "count:" << count++ << endl;
            cout << "Channel Count:"<< frame.channels() << endl;
  //        cvtColor(frame, edges, CV_BGR2GRAY);
            imshow("edges", edges);
            if(waitKey(30) >= 0) break;
        }
        // the camera will be deinitialized automatically in VideoCapture destructor
        return 0;
    }.

现在我得到了灰度图像,但它只运行了几帧(2-4帧,不同),然后挂起。有趣的是,如果你等待足够长的时间,有时它会在"选择超时"消息后再扫描几帧。

在运行应用程序之前,我尝试过运行以下程序,但似乎没有帮助:

rmmod uvcvideo
modprobe uvcvideo nodrop=1 timeout=5000

此外,尽管我指定相机分辨率为720x480(根据相机规格),但它报告的帧大小为640x480。

当我取出以下代码时:

cvtColor(frame, edges, CV_BGR2GRAY);

它是有效的,但它不是灰度图像,它是绿色的。请注意,我已经对设置框架宽度和高度进行了注释。

由于您是从相机捕捉帧,因此只要帧准备好,它就会捕捉帧,所以您不需要等待30毫秒,只需1毫秒就足够了,而且在将帧转换为灰色之前,请确保它有3个通道(如RGB或BGR帧)。

顺便说一句,cv::VideoCapture::Set函数可能在某些设备或某些属性上不起作用。要设置图像尺寸,您应该检查相机的可接受尺寸,例如,它可能只接受320x200、640x480、600x800。。。

原来我有电源问题。我增加了pi板的功率(/boot/config.txt中有一个设置可以做到这一点),但这还不够。我添加了一个USB电源分配器,并使用了一个台式电源。