【OpenCV归纳】4 关于HighGUI
通過HighGUI(high-level graphical user interface)可以實現(xiàn)打開窗口、顯示圖像、讀出和寫入圖像文件,處理鼠標(biāo)、光標(biāo)、鍵盤事件。而HighGUI主要分成“視頻輸入/輸出”、“圖像輸入/輸出”和“GUI工具”,分別在cacap*、grfmt*和window*源文件中實現(xiàn)。
int cvNamedWindow?
( const char* name,?
? int flags=CV_WINDOW_AUTOSIZE?
);
int cvNamedWindow
( const char* name,
? int????????????? flags=CV_WINDOW_AUTOSIZE
);
第一個參數(shù)用來表示新窗口的名稱,這個名稱顯示在窗口的頂部,同時用作HighGUI中其他函數(shù)調(diào)用窗口的句柄。第二參賽是個標(biāo)志,用來表示是否需要使窗口大小自動適應(yīng)讀入的圖像大小。釋放可以用cvReleaseImage()和cvDestroyWindow()來實現(xiàn)。
?????? 載入圖像可以用cvLoadImage(),當(dāng)打開一副圖像時,該函數(shù)并不分析文件擴展名,而是通過分析圖像文件的前幾個字節(jié)來確定圖像的編碼格式。注意:當(dāng)cvLoadImage()讀入失敗時,并不會產(chǎn)生一個運行時錯誤,而是返回一個空指針。與cvLoadImage()對應(yīng)的函數(shù)是cvSaveImage(),其實現(xiàn)了保存圖像功能。
IplImage* cvLoadImage?
( const char* filename,?
? int????????????? iscolor=CV_LOAD_IMAGE_COLOR?
);?
?
int cvSaveImage?
(?
?const char*?? filename,?
?const CvArr* image?
);??
?IplImage* cvLoadImage
( const char* filename,
? int????????????? iscolor=CV_LOAD_IMAGE_COLOR
);
int cvSaveImage
(
? const char*?? filename,
? const CvArr* image
);
代碼中的CvArr是C語言的風(fēng)格,功能與面向?qū)ο笳Z言中基類類似的結(jié)構(gòu)。同樣的顯示圖像可以用cvShowImage()。我比較喜歡讀代碼所以在此貼一段標(biāo)準(zhǔn)的實例吧。
int main(int argc,char** argv)?
{?
??? // Create a named window with the name of the file.?
??? cvNamedWindow(argv[1],1]);?
?
??? // Load the image from the given file name.?
??? IplImage* img=cvLoadImage(argv[1]);?
?
??? // Show the image the user hits the "Esc" key.?
??? while(1)?
??? {?
??????? if(cvWaitKey(100)==27)?
???????????? break;?
???? }?
???? // Clean up and don't be piggies?
???? cvDestoryWindow(argv[1]);?
???? cvReleaseImage(&img);?
}
int main(int argc,char** argv)
{
??? // Create a named window with the name of the file.
??? cvNamedWindow(argv[1],1]);
??? // Load the image from the given file name.
??? IplImage* img=cvLoadImage(argv[1]);
??? // Show the image the user hits the "Esc" key.
??? while(1)
??? {
??????? if(cvWaitKey(100)==27)
???????????? break;
???? }
???? // Clean up and don't be piggies
???? cvDestoryWindow(argv[1]);
???? cvReleaseImage(&img);
}
?? 在cvLoadImage()中當(dāng)然你也可以直接輸入Linux地址。
void cvMoveWindow?
( const char* name,?
? int? x,?
? int? y?
);??
void cvMoveWindow
( const char* name,
? int? x,
? int? y
);
cvMoveWindow()將窗口移動到其左上角為x,y的位置。下面介紹要給很重要的函數(shù)。
while(1)?
{?
??? if(cvWaitKey(1000)==27)?
??????? break;?
}??
?while(1)
{
??? if(cvWaitKey(1000)==27)
??????? break;
}
在這個程序中,則是告訴OpenCV等待用戶觸發(fā)事件100ms,如果在100ms內(nèi)沒有用戶觸發(fā)則繼續(xù)循環(huán);如果用戶觸發(fā)且按鍵ASCII碼為27(ESC),則退出循環(huán)。
在鼠標(biāo)事件中,和鍵盤當(dāng)然最大的不同就是,鼠標(biāo)響應(yīng)事件采用回掉函數(shù)的方式來處理。因此為了可以響應(yīng)鼠標(biāo)點擊事件,首先必須創(chuàng)建一個回掉函數(shù)。在創(chuàng)建這個函數(shù)之后需要在OpenCV中注冊這個函數(shù),以便特定窗口被觸發(fā)鼠標(biāo)事件后,OpenCV可以正確的調(diào)用這個函數(shù)。
void CvMouseCallback
(
?? int event,
?? int x,
?? int y,
?? int flags,
?? void* param
);
event必須是以下表中的一個值。第二個以及第三個參數(shù)被設(shè)置成事件發(fā)生時鼠標(biāo)位置的x,y坐標(biāo)值。注意:這些坐標(biāo)代表窗口中圖像的像素坐標(biāo),與窗口的大小沒有關(guān)系。第四個參數(shù)flags,每一位指定了在事件發(fā)生時的不同狀態(tài)。例如CV_EVENT_FLAGS_SHIFTKEY的值為16(flags的第五位為1),如果想知道shift是否被觸發(fā),可以用flags與位掩碼(1<<4)求與。最后一個參數(shù)是一個void指針,可以用來以任何結(jié)構(gòu)方式傳遞額外的參數(shù)信息。
| 事件名稱 | 數(shù)值 |
| CV_EVENT_MOUSEMOVE | 0 |
| CV_EVENT_LBUTTONDOWN | 1 |
| CV_EVENT_RBUTTONDOWN | 2 |
| CV_EVENT_MBUTTONDOWN | 3 |
| CV_EVENT_LBUTTONUP | 4 |
| CV_EVENT_RBUTTONUP | 5 |
| CV_EVENT_MBUTTONUP | 6 |
| CV_EVENT_LBUTTONDBLCLK | 7 |
| CV_EVENT_RBUTTONDBLCLK | 8 |
| CV_EVENT_MBUTTONDBLCLK | 9 |
實現(xiàn)注冊的函數(shù)是cvSetMouseCallback(),該函數(shù)需要3個參數(shù)。第一個參數(shù)指定了回掉函數(shù)需要注冊到的窗口,第二個參數(shù)為回掉函數(shù),最后一個參數(shù)用來傳遞額外的信息給前面提到的void* param參數(shù)。
void cvSetMouseCallback?
(?
??? const char* window_name,?
??? CvMouseCallback? on_mouse,?
??? void* param=NULL?
);?
void cvSetMouseCallback
(
??? const char* window_name,
??? CvMouseCallback? on_mouse,
??? void* param=NULL
);
以下是一個完整的實例。
#include<cv.h>?
#include<highgui.h>?
?
void my_mouse_callback(int event, int x, int y, int flags, void* param);?
?
CvRect box;?
bool drawing_box = false;?
?
// A litte subroutine to draw a box onto an image?
void draw_box(IplImage* img, CvRect rect)?
{?
??? cvRectangle(img,??
??????? cvPoint(box.x, box.y),??
??????? cvPoint(box.x + box.width, box.y + box.height),?
??????? cvScalar(0xff, 0x00, 0x00));?
}?
?
int main(int argc, char* argv[])?
{?
??? box = cvRect(-1, -1, 0, 0);?
??? IplImage* image = cvCreateImage(?
??????? cvSize(200, 200),?
??????? IPL_DEPTH_8U,?
??????? 3);?
??? cvZero(image);?
??? IplImage* temp = cvCloneImage(image);?
??? cvNamedWindow("Box Example");?
?
??? cvSetMouseCallback("Box Example",?
??????? my_mouse_callback,?
??????? (void*)image);?
?
??? while (1)?
??? {?
??????? cvCopyImage(image, temp);?
??????? if (drawing_box)?
??????????? draw_box(temp, box);?
??????? cvShowImage("Box Example", temp);?
?
??????? if (cvWaitKey(15) == 27)?
??????????? break;?
??? }?
?
??? cvReleaseImage(&image);?
??? cvReleaseImage(&temp);?
??? cvDestroyWindow("Box Example");?
}?
?
void my_mouse_callback(int event, int x, int y, int flags, void* param)?
{?
??? IplImage* image = (IplImage*)param;?
?
??? switch (event)?
??? {?
??? case CV_EVENT_MOUSEMOVE:?
??? {?
??????? if (drawing_box)?
??????? {?
??????????? box.width = x - box.x;?
??????????? box.height = y - box.y;?
??????? }?
??? }?
??????? break;?
??? case CV_EVENT_LBUTTONDOWN:?
??? {?
??????? drawing_box = true;?
??????? box = cvRect(x, y, 0, 0);?
??? }?
??????? break;?
??? case CV_EVENT_LBUTTONUP:?
??? {?
??????? drawing_box = false;?
??????? if (box.width < 0)?
??????? {?
??????????? box.x += box.width;?
??????????? box.width *= -1;?
??????? }?
??????? if (box.height<0)?
??????? {?
??????????? box.y += box.height;?
??????????? box.height *= -1;?
??????? }?
??????? draw_box(image, box);?
??? }?
??????? break;?
??? }?
}
轉(zhuǎn)載于:https://www.cnblogs.com/NoMasp/p/4357159.html
總結(jié)
以上是生活随笔為你收集整理的【OpenCV归纳】4 关于HighGUI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ之主题(Topic)
- 下一篇: 第十二节 VMware View 6.0