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()
重新開啟主控台介面
2 意見:
能請問我照你的程式碼在vs2008上執行
會出現
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvDestroyWindow 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvReleaseCapture 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvWaitKey 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvShowImage 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvQueryFrame 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvNamedWindow 在函式 _main 中被參考
1>webcom.obj : error LNK2019: 無法解析的外部符號 _cvCreateCameraCapture 在函式 _main 中被參考
1>D:\Yu\projects\webcom\Debug\webcom.exe : fatal error LNK1120: 7 個無法解析的外部符號
在方案總管->專案->屬性->組態屬性->連結器->輸入->其他相依性那邊加上highgui200.lib
張貼留言