我正在使用OpenCV 2.4.5和Visual Studio 2012在C ++中编写程序。我最简单的形式是从网络摄像头检索图像,在屏幕上显示,然后退出应用程序。第一部分工作,但我无法退出应用程序。
我在system("pause")
函数末尾使用cin.get()
命令而不是main
,因为我现在需要那行输出,尽管暂时失去了可移植性。为什么?因为我看到“按任意键继续...”行,但控制台没有退出。
我在waitKey(1)
之后使用showFrame()
尝试'抽水',但它没有帮助。如果我删除cvStartWindowThread()
没有任何更改(我注意到,至少)。该应用程序似乎无法关闭控制台。 Visual Studio仍处于调试模式,从showFrame()
返回后,我甚至无法使用Ctrl + C中断程序。我不知道如何解决这个问题。
该项目仍然是非常多的WIP,但我将在此处包含相关代码:
定义:
#define EXTERNAL_CAM 0
#define BUILT_IN_CAM 1
#define SINGLE_SHOT 0
#define VIDEO_GRAB 1
#define WINDOW "Frame"
main
功能:
int main() {
Mat frame = getFrameFromCam(EXTERNAL_CAM, SINGLE_SHOT);
showFrame(WINDOW, frame);
system("pause");
return 0;
}
getFrameFromCam
功能:
Mat getFrameFromCam(int cam, int captureMode) {
Mat frame;
CvCapture* capture = cvCaptureFromCAM(cam);
IplImage* iplImage;
switch(captureMode) {
case SINGLE_SHOT:
iplImage = cvQueryFrame(capture);
frame = iplImage;
break;
case VIDEO_GRAB:
bool firstFrame = true;
do {
iplImage = cvQueryFrame(capture);
frame = iplImage;
showVideo(WINDOW, frame, firstFrame, false);
firstFrame = false;
} while (cin.get() != 'y');
showVideo(WINDOW, frame, firstFrame, true);
break;
}
return frame;
}
showFrame
功能:
void showFrame(string window, Mat frame) {
cvStartWindowThread();
namedWindow(WINDOW, CV_WINDOW_AUTOSIZE);
imshow(WINDOW, frame);
waitKey(0);
destroyWindow(WINDOW);
return ;
}
答案 0 :(得分:2)
我正在回答我自己的问题,因为没有其他人尝试过:
问题是我正在尝试使用单独的功能从相机中获取帧。 @Aurelius通过引用VideoCapture
回答了各种问题。通过使用该函数,我能够在main
函数中减少必要的代码 - 最初我试图通过从main
中分离framegrabber来减少main
函数中的代码。
在C ++和OpenCV方面比我更熟练的人可能能够提供更正确的答案,但这是我的解决方案:
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\core\core.hpp"
#include <iostream>
#define EXTERNAL_CAM 0
#define BUILT_IN_CAM 1
#define WINDOW_TITLE "Frame"
int main() {
VideoCapture cap(EXTERNAL_CAM);
Mat frame;
if(!cap.isOpened()) {
cout << "No cap.\n";
} else {
cap >> frame;
showFrame(WINDOW_TITLE, frame);
}
cin.get();
return 0;
}
void showFrame(string window, Mat frame) {
if(frame.data != NULL) {
namedWindow(WINDOW_TITLE, 1);
imshow(WINDOW_TITLE, frame);
waitKey(30);
} else {
cout << "No frame detected!\n";
}
return ;
}