我试图将来自摄像机的视频旋转 90 度,我尝试使用 cvTranspose
和 cvFlip
但结果是:
Unhandled exception at 0x752bc41f in CameraStero.exe: Microsoft C++ exception: cv::Exception at memory location 0x0021faf8..
这是我的代码。
#include <opencv\cv.h>
#include <opencv\highgui.h>
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap1;
cap1.open(0);
cap1.set(CV_CAP_PROP_FPS, 0.55);
cap1.set(CV_CAP_PROP_FRAME_WIDTH, 800.0);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 800.0);
Mat img1, img2;
for(;;){
CvCapture* cap;
IplImage* frame;
cap = cvCreateCameraCapture( 0 );
cvGrabFrame(cap);
frame=cvRetrieveFrame(cap);
cvTranspose(frame, frame);
cvFlip(frame, frame, 1);
cvShowImage("Img1", frame);
if(waitKey(1)=='q')
break;
}
}
有什么纠正代码的建议吗?
最佳答案
您应该将拍摄参数保留为默认值,因为如果相机不支持您设置的设置,这可能会导致错误。所以删除以下行:
cap1.set(CV_CAP_PROP_FPS, 0.55); cap1.set(CV_CAP_PROP_FRAME_WIDTH, 800.0); cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 800.0);
或者如果您确实需要更改宽度和高度,则应确保要设置的宽度/高度应小于默认值。下面的代码也可以工作:
cap1.set(CV_CAP_PROP_FPS, 0.55); cap1.set(CV_CAP_PROP_FRAME_WIDTH, 320); cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
就像@SRF 所说的,您混淆了 OpenCV C/C++ 接口(interface),所以您要么使用
cap = cvCreateCameraCapture( 0 );
或
cap1.open(0);
,但不是两者。
当您想在一个窗口中显示您捕获的图像时,您应该首先通过以下方式创建窗口:
cv::namedWindow("Img1", 1);
不要忘记在
int main()
中return 0;
。尽管某些编译器不对此进行限制,但您应该一如既往地这样做。
修复所有这些后,代码应如下所示(在我的电脑上运行良好):
int main()
{
VideoCapture cap1;
cap1.open(0);
cap1.set(CV_CAP_PROP_FPS, 0.55);
cap1.set(CV_CAP_PROP_FRAME_WIDTH, 320);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
cv::namedWindow("Img1", 1);
Mat frame;
for(;;)
{
Mat frame;
cap1 >> frame;
transpose(frame, frame);
flip(frame, frame, 1);
imshow("Img1", frame);
if(waitKey(1)=='q')
break;
}
cap1.release();
return 0;
}
关于c++ - 旋转视频opencv C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20851177/