当你在做GUI接口的时候,会有黑底白字的命令及提示字符出现真的很讨厌,明明已经是窗口接口了,为什么还需要有黑框跑出来,这个问题在OpenCV的程 序里都是这样执行的,也许久而久之就习惯了,不过,OpenCV还是可以做得到纯GUI接口,需要用到的是"wincon.h"(Windows Console)控制台控制接口的函数库,它包在"windows.h"里,而实际上"highgui.h"就有包含"windows.h"的函数库,直 接用"highgui.h"就好了,而要关闭黑底白字的控制台接口其实很简单,就只要用到FreeConsole()这个函数就好了,但是,控制台接口还 是必要的,因为OpenCV窗口接口少了很多窗口接口该有的功能,如Label,Button,Eidt,Memo等文字输入/显示的设计,如果真的需要 看到文字显示信息,或是输入数据,控制台的存在是不可或缺的.当关闭控制台接口时,如果说遇到要暂时输入文字信息则在用AllocConsole()再度 打开控制台吧.
Webcam关闭控制台程序
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
int main()
{
FreeConsole();
CvCapture *capture;
IplImage *frame;
capture =cvCaptureFromCAM(0) ;
cvNamedWindow("Webcam",0);
while(true)
{
frame = cvQueryFrame(capture);
cvShowImage("Webcam",frame);
if(cvWaitKey(10)>=0)
{
break;
}
}
cvReleaseCapture(&
capture);
cvDestroyWindow("Webcam");
}
执行结果:
这 里实际上存在一个很严重的问题,当把控制台接口关闭的时候,虽然只会出现图像接口,但是,控制台的操控是在背景作业的,而打开的窗口接口是一个执行绪,想 了解执行绪是什么则要去看操作系统原理等相关书籍,所以在这边,如果是用cvWaitKey()的方法按键盘任意键结束窗口接口是不会有什么问题的,可是 如果是按GUI接口上右上角的关闭窗口,就会造成GUI接口这个执行绪被关闭,而实际上,背景作业的进程(process)仍在继续执行,如果说是用图片 档实例是没什么太大的问题,可是如果是用视频播放程序的话,即使把GUI接口关闭,但是它装置还是在继续播放的.它仍然在跑while循环,仍然在不停的 读图片,而这时的cvWaitKey()也失去作用了,因为cvWaitKey()是等待GUI接口上键盘事件的发生,而GUI接口这个执行绪被关闭了, 就会变成只会卡內存(约8MB以上),每秒不断造成分页错误的程序了.
产生问题:每秒产生988个分页错误(分页错误差异),卡死內存8700KB(8MB)
要解决这样的问题就要多加一个判断,当窗口接口的执行绪被关闭的时候就要顺便把进程也关闭,程序代码如下
Webcam关闭控制台程序2
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
int main()
{
FreeConsole();
CvCapture *capture;
IplImage *frame;
capture =cvCaptureFromCAM(0) ;
cvNamedWindow("Webcam",0);
while(true)
{
frame = cvQueryFrame(capture);
cvShowImage("Webcam",frame);
if(cvWaitKey(10)>=0)
{
break;
}
if(!cvGetWindowHandle("Webcam"))
{
break;
}
}
cvReleaseCapture(&
capture);
cvDestroyWindow("Webcam");
}
这边的判断就只是多做了一个侦测"Webcam"这个窗口的HWND是否存在,如果不存在的话就跳出while循环,而程序才会继续跳出while的下一步释放內存并关闭这个程序的进程.
FreeConsole()
控制台接口背景作业
AllocConsole()
重新打开控制台接口