日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV归纳】4 关于HighGUI

發(fā)布時(shí)間:2024/4/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV归纳】4 关于HighGUI 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


通過HighGUI(high-level graphical user interface)可以實(shí)現(xiàn)打開窗口、顯示圖像、讀出和寫入圖像文件,處理鼠標(biāo)、光標(biāo)、鍵盤事件。而HighGUI主要分成“視頻輸入/輸出”、“圖像輸入/輸出”和“GUI工具”,分別在cacap*、grfmt*和window*源文件中實(shí)現(xiàn)。

int cvNamedWindow?
( const char* name,?
? int flags=CV_WINDOW_AUTOSIZE?
);

int cvNamedWindow
( const char* name,
? int????????????? flags=CV_WINDOW_AUTOSIZE
);

第一個(gè)參數(shù)用來(lái)表示新窗口的名稱,這個(gè)名稱顯示在窗口的頂部,同時(shí)用作HighGUI中其他函數(shù)調(diào)用窗口的句柄。第二參賽是個(gè)標(biāo)志,用來(lái)表示是否需要使窗口大小自動(dòng)適應(yīng)讀入的圖像大小。釋放可以用cvReleaseImage()和cvDestroyWindow()來(lái)實(shí)現(xiàn)。

?????? 載入圖像可以用cvLoadImage(),當(dāng)打開一副圖像時(shí),該函數(shù)并不分析文件擴(kuò)展名,而是通過分析圖像文件的前幾個(gè)字節(jié)來(lái)確定圖像的編碼格式。注意:當(dāng)cvLoadImage()讀入失敗時(shí),并不會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)錯(cuò)誤,而是返回一個(gè)空指針。與cvLoadImage()對(duì)應(yīng)的函數(shù)是cvSaveImage(),其實(shí)現(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語(yǔ)言的風(fēng)格,功能與面向?qū)ο笳Z(yǔ)言中基類類似的結(jié)構(gòu)。同樣的顯示圖像可以用cvShowImage()。我比較喜歡讀代碼所以在此貼一段標(biāo)準(zhǔn)的實(shí)例吧。

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()將窗口移動(dòng)到其左上角為x,y的位置。下面介紹要給很重要的函數(shù)。

while(1)?
{?
??? if(cvWaitKey(1000)==27)?
??????? break;?
}??
?while(1)
{
??? if(cvWaitKey(1000)==27)
??????? break;
}

在這個(gè)程序中,則是告訴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ù)的方式來(lái)處理。因此為了可以響應(yīng)鼠標(biāo)點(diǎn)擊事件,首先必須創(chuàng)建一個(gè)回掉函數(shù)。在創(chuàng)建這個(gè)函數(shù)之后需要在OpenCV中注冊(cè)這個(gè)函數(shù),以便特定窗口被觸發(fā)鼠標(biāo)事件后,OpenCV可以正確的調(diào)用這個(gè)函數(shù)。

void CvMouseCallback
(
?? int event,
?? int x,
?? int y,
?? int flags,
?? void* param
);

event必須是以下表中的一個(gè)值。第二個(gè)以及第三個(gè)參數(shù)被設(shè)置成事件發(fā)生時(shí)鼠標(biāo)位置的x,y坐標(biāo)值。注意:這些坐標(biāo)代表窗口中圖像的像素坐標(biāo),與窗口的大小沒有關(guān)系。第四個(gè)參數(shù)flags,每一位指定了在事件發(fā)生時(shí)的不同狀態(tài)。例如CV_EVENT_FLAGS_SHIFTKEY的值為16(flags的第五位為1),如果想知道shift是否被觸發(fā),可以用flags與位掩碼(1<<4)求與。最后一個(gè)參數(shù)是一個(gè)void指針,可以用來(lái)以任何結(jié)構(gòu)方式傳遞額外的參數(shù)信息。

事件名稱數(shù)值
CV_EVENT_MOUSEMOVE0
CV_EVENT_LBUTTONDOWN1
CV_EVENT_RBUTTONDOWN2
CV_EVENT_MBUTTONDOWN3
CV_EVENT_LBUTTONUP4
CV_EVENT_RBUTTONUP5
CV_EVENT_MBUTTONUP6
CV_EVENT_LBUTTONDBLCLK7
CV_EVENT_RBUTTONDBLCLK8
CV_EVENT_MBUTTONDBLCLK9

實(shí)現(xiàn)注冊(cè)的函數(shù)是cvSetMouseCallback(),該函數(shù)需要3個(gè)參數(shù)。第一個(gè)參數(shù)指定了回掉函數(shù)需要注冊(cè)到的窗口,第二個(gè)參數(shù)為回掉函數(shù),最后一個(gè)參數(shù)用來(lái)傳遞額外的信息給前面提到的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
);

以下是一個(gè)完整的實(shí)例。

#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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。