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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域

發(fā)布時間:2025/3/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

OpenCV是一個著名的計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。

程序的大致效果就是:顯示一張較大的圖像,鼠標(biāo)在圖像上移動的時候會實時的顯示一個"十"字的交叉線,然后在圖像上點兩個點得到的矩形框就是感興趣區(qū)域。

一、介紹一下OpenCV中如何設(shè)置鼠標(biāo)事件的回調(diào)函數(shù)

1)設(shè)置鼠標(biāo)回調(diào)函數(shù)

?void ? SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)

參數(shù)說明:

winname: 窗口的名字

onMouse: 鼠標(biāo)事件發(fā)生的時候,調(diào)用的函數(shù)的函數(shù)指針

userdata: 在鼠標(biāo)事件發(fā)生的時候,傳給調(diào)用函數(shù)的參數(shù)

2)對第二個參數(shù)MouseCallback onMouse的詳細說明:

它表示鼠標(biāo)事件發(fā)生的時候,被調(diào)用的函數(shù)的函數(shù)指針,其函數(shù)原型為:

void my_mouse(int event, int x, int y, int flags, void* param);
  • event是鼠標(biāo)事件類型,OpenCV中定義的常見事件有(枚舉類型變量):
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,CV_EVENT_MOUSEWHEEL =10,CV_EVENT_MOUSEHWHEEL =11
  • x, y表示鼠標(biāo)在圖像坐標(biāo)系中的位置
  • flags是CV_EVENT_FLAG的組合,用來表示鼠標(biāo)拖拽的事件,其狀態(tài)有:
EVENT_FLAG_LBUTTON //左鍵拖拽EVENT_FLAG_RBUTTON //右鍵拖拽EVENT_FLAG_MBUTTON //中鍵拖拽EVENT_FLAG_CTRLKEY //按住Ctrl不放EVENT_FLAG_SHIFTKEY //按住Shift不放EVENT_FLAG_ALTKEY //按住Alt不放
  • params用來接收函數(shù)被調(diào)用時,用戶傳給它的數(shù)據(jù)(注意是一個void*類型)

二、上代碼

#include #include #include using namespace cv;using namespace std;#define WIN_NAME "Pano"#define PANO_IMAGE_PATH "/home/llf/Pictures/cat.jpg"#define ROI_SAVE_PATH "/home/llf/Pictures/res_roi.jpg"Mat pano, pano_raw, pano_dst;vector two_points;/* * 鼠標(biāo)事件回調(diào)*/void my_mouse_call_back(int event, int x, int y, int flags, void* param) { switch (event) { case CV_EVENT_MOUSEMOVE: pano = pano_raw.clone(); line(pano, Point(x, 0), Point(x, pano.rows), Scalar(0, 255, 0), 5); line(pano, Point(0, y), Point(pano.cols, y), Scalar(0, 255, 0), 5); break; case CV_EVENT_LBUTTONDOWN: if(two_points.size() < 2) { Point p(x, y); two_points.push_back(p); line(pano_raw, Point(x, 0), Point(x, pano_raw.rows), Scalar(0, 255, 0), 10); line(pano_raw, Point(0, y), Point(pano_raw.cols, y), Scalar(0, 255, 0), 10); } break; case CV_EVENT_RBUTTONDOWN: { Mat roi = pano_dst(Rect(two_points[0], two_points[1])); namedWindow("roi", WINDOW_NORMAL); imshow("roi", roi); waitKey(0); imwrite(ROI_SAVE_PATH, roi); destroyWindow("roi"); } break; default: break; }}int main(int argc, char **argv) { pano = imread(PANO_IMAGE_PATH, IMREAD_COLOR); pano_dst = (pano_raw = pano.clone()).clone(); namedWindow(WIN_NAME, WINDOW_NORMAL); setMouseCallback(WIN_NAME, my_mouse_call_back, NULL); int key = -1; while(27 != key) { imshow(WIN_NAME, pano); key = waitKey(20); } return 0;}

效果:鼠標(biāo)挪到哪里,十字架的中心就挪到哪里

如果對我的推|文有興趣,歡迎轉(zhuǎn)|載分|享。也可以推|薦給朋友關(guān)|注哦。只推干貨,寧缺毋濫。

總結(jié)

以上是生活随笔為你收集整理的vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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