设备:
我正在使用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;
}
答案 0 :(得分:2)
sudo modprobe bcm2835-v4l2
加载用于cv视频捕获方法的Linux驱动程序的预安装视频
答案 1 :(得分:1)
我曾经有过同样的问题,为Raspberry Pi相机模块组装了一个漂亮的小包装器,因此您可以轻松地将图像检索为cv::Mat
。
有一个简单的c ++版本:https://jsfiddle.net/ewrcxrrp/和PiCapture插件版本:OpenFrameworks
答案 2 :(得分:0)
OpenCV没有将raspiCam视为相机。我更喜欢使用system()命令从raspiCam获取帧并将其保存在文件系统中的某个位置。之后,您可以将其作为图像加载到程序中。或者你可以尝试这个BlogPost。
我希望它有所帮助。