我尝试将相机中的视频旋转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;
}
}
任何纠正代码的建议?
答案 0 :(得分:0)
您正在混合使用OpenCV c ++和c接口。这是如何在OpenCV / C中完成的。
#include <opencv\cv.h>
#include <opencv\highgui.h>
int main(int argc, char** argv)
{
CvCapture* cap = cvCreateCameraCapture( 0 );
for(;;)
{
IplImage* frame=cvQueryFrame(cap);
cvTranspose(frame, frame);
cvFlip(frame, frame, 1);
cvShowImage("Img1", frame);
if(waitKey(30)=='q')
break;
}
cvReleaseCapture(cap);
}
答案 1 :(得分: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);
或者如果您确实需要更改宽度和高度,则应确保要设置的宽度/高度应小于默认值。以下代码也可以使用:
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 ++接口,所以要么使用
cap = cvCreateCameraCapture( 0 );
或
cap1.open(0);
,但不是两者。
如果要在一个窗口中显示捕获的图像,则应首先通过以下方式创建窗口:
cv::namedWindow("Img1", 1);
请勿忘记return 0;
中的int main()
。虽然某些编译器不限制此操作,但您应该一如既往地执行此操作。
修复所有这些后,代码应如下所示(在我的电脑上正常工作):
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;
}