为什么VideoCapture isOpened()在我的工作相机上使用Raspberry Pi上的OpenCV失败了?

时间:2015-08-10 15:19:00

标签: opencv video-capture raspberry-pi2

设备:

  • Raspberry Pi 2 B
  • OS:Raspbian(Debian Wheezy,2015年5月5日发布)
  • OpenCV 3.0.0(2015年6月4日发布)

我正在使用Raspberry Pi的CSI端口上的相机。命令

raspistill -o test.jpg

工作正常:它会拍照并将其保存在我的Raspberry上。所以相机效果很好。

六月份,我展示了相机并可以应用其他一些功能,例如检测边缘或线条。几天前,我想进一步,但突然间我遇到了imshow的问题。

例如,以下代码在6月工作但现在返回错误

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/pi/opencv-3.0.0/modules/highgui/src/window.cpp, line 271
terminate called after throwing an instance of 'cv::Exception'
what():  /home/pi/opencv-3.0.0/modules/highgui/src/window.cpp:271: error: (-215) size.width>0 && size.height>0 in function imshow

以下是6月份的代码:

#include <cv.hpp>
#include <cxcore.hpp>
#include <stdlib.h>
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    int c;

    Mat image;
    VideoCapture video;

    video.open(0);

    while(1)
    {
        video >> image;
        imshow("test", image);

        c=waitKey(10);
        if (c==27)
            break;
    }

    video.release();
    return 0;
}

我尝试通过添加代码来解决我的问题(如延迟,调整大小,检查视频是否打开,检查要显示的图像是否为空)或删除一些(如vid.open)。但是,它仍然无效。我得到的总是“打开视频...视频没有打开”。这意味着测试vid.isOpened总是返回false。我试图打开另一个视频(即使我的相机不是问题因为它与raspistill一起工作,如下所述)但错误是相同的,isOpened是假的。

这是我修改后的代码:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main()
{
    Mat image;
    VideoCapture vid(0); // open the default camera
    //VideoCapture vid("/home/pi/video.mp4"); // open a video file
    cout << "opening video... ";

    waitKey(1000); // add delay if the camera did not have time to open correctly

    //vid.set(CV_CAP_PROP_FRAME_WIDTH, 640); // resize
    //vid.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

    //vid.open(0); // do not open twice, already done in VideoCapture vid(0)

    if(!vid.isOpened()) // check if video is successfully opened
    {
        cout << "video did not open ";
        return -1;
    }
    cout << "video opened correctly ";

    namedWindow( "test", CV_WINDOW_AUTOSIZE ); // prepare the window

    waitKey(1000); // add delay if the camera did not have time to open correctly

    cout << "before while loop ";

    while(1)
    {
        cout << "inside while loop ";
        vid >> image; // get a frame from camera
        if(!image.empty()) // wait for the image to be taken
        {
            cout << "displaying image ";
            imshow("test", image); // display it
        } else {
            cout << "image empty ";
        }

        if (waitKey(10)==27) // waiting for esc key to be pressed for 10ms
            break;

    }

    vid.release();
    return 0;
}

有人可以帮我解决这个问题吗?我真的不明白为什么我现在有这个问题,因为它在六月完美运行,我没有改变我的覆盆子。 在此先感谢您的帮助!

编辑:我认为我能做的最后一件事就是重新安装所有东西(OS Raspbian和OpenCV),因为它在六月完美运行,而不安装你在答案中提出的任何其他库。我真的不知道6月到现在之间发生了什么变化,因为没有人在Raspberry上触及任何东西,我的代码不再适用了:(

EDIT2:与PiCapture库一起使用的代码:

#include <cv.hpp>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"
#include "/home/pi/PiCapture/src/PiCapture.cpp"


using namespace cv;
using namespace std;

int main()
{

    PiCapture cap;
    namedWindow("PiCapture");
    cap.open(320, 240, true); // 320 width, 240 height, color true

    while(1)
    {
        Mat img;
        img = cap.grab(); // get a frame from camera
        if(!image.empty()) // wait for the image to be taken
        {
            imshow("PiCapture", img); // display it
        }
        if (waitKey(10)==27) // waiting for esc key to be pressed for 10ms
            break;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

sudo modprobe bcm2835-v4l2

加载用于cv视频捕获方法的Linux驱动程序的预安装视频

答案 1 :(得分:1)

我曾经有过同样的问题,为Raspberry Pi相机模块组装了一个漂亮的小包装器,因此您可以轻松地将图像检索为cv::Mat

有一个简单的c ++版本:https://jsfiddle.net/ewrcxrrp/PiCapture插件版本:OpenFrameworks

ofxCvPiCam

答案 2 :(得分:0)

OpenCV没有将raspiCam视为相机。我更喜欢使用system()命令从raspiCam获取帧并将其保存在文件系统中的某个位置。之后,您可以将其作为图像加载到程序中。或者你可以尝试这个BlogPost

我希望它有所帮助。