C++应用程序控制台未退出

C++ application console not exiting

本文关键字:退出 控制台 应用程序 C++      更新时间:2023-10-16

我正在使用OpenCV 2.4.5和Visual Studio 2012用C++编写程序。最简单的形式是,我从网络摄像头中检索图像,将其显示在屏幕上,然后退出应用程序。第一部分工作,但我无法退出应用程序。

我在main函数的末尾使用system("pause")命令而不是cin.get(),因为我现在需要这行输出,尽管暂时失去了可移植性。为什么?因为我看到"按任意键继续…"行,但控制台没有退出。

我试过在showFrame()之后使用waitKey(1)进行"泵送",但没有帮助。如果我删除cvStartWindowThread(),则没有任何变化(至少我注意到了这一点)。应用程序似乎无法关闭控制台。Visual Studio也仍处于调试模式,从showFrame()返回后,我甚至无法使用Ctrl+C中断程序。我不知道如何解决这个问题。

该项目仍然是在制品,但我将在这里包括相关代码:

定义:

#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 ; 
}

我在回答我自己的问题,因为没有其他人尝试过:

问题是,我正试图使用一个单独的功能从相机中获取一个帧@奥勒留提到VideoCapture,回答了这个问题。通过使用该函数,我可以减少main函数中的必要代码——最初我试图通过将帧捕获器与main分离来减少main函数中的代码。

比我更精通C++和OpenCV的人可能会给出更正确的答案,但这是我的解决方案:

#include "opencv2highguihighgui.hpp"
#include "opencv2imgprocimgproc.hpp"
#include "opencv2corecore.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 ; 
}