OpenCV图像处理使用笔记(一)——使用鼠标选取任何形状的ROI
生活随笔
收集整理的這篇文章主要介紹了
OpenCV图像处理使用笔记(一)——使用鼠标选取任何形状的ROI
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
1.在圖像處理中,會(huì)用鼠標(biāo)選擇一個(gè)感興趣的區(qū)域進(jìn)行相關(guān)的操作,我這里演示如何用鼠標(biāo)選擇任何形狀的ROI,就你Ps的摳圖一樣,使用鼠標(biāo)左鍵選擇一個(gè)任何形狀的區(qū)域,生成新的圖像。
2.我演示的代碼環(huán)境是,IDE是VS2015,使用的是OpenCV3.30這個(gè)版本。
選擇任何形狀的ROI
#include <iostream> #include<opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv;//定義全局坐標(biāo)系 Point prev_pt = Point(-1, -1); Mat src, background_img, foreground_img;void on_mouse(int event, int x, int y, int flags, void*){//松開(kāi)鼠標(biāo)左鍵或不是按住左鍵拖拽的動(dòng)作時(shí),把坐標(biāo)還原 if (event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON)) {prev_pt = Point(-1, -1);}//按下左鍵else if (event == CV_EVENT_LBUTTONDOWN) {prev_pt = Point(x, y);}//移動(dòng)鼠標(biāo)并按住左鍵拖拽else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)) {Point pt = Point(x, y);//前景模板上劃線line(foreground_img, prev_pt, pt, Scalar(255), 2, 8, 0); //原圖上劃線 Scalar::all(255)意思就是BGR通道像素值全為255line(src, prev_pt, pt, Scalar::all(255), 2, 8, 0); //起點(diǎn)等于終點(diǎn),說(shuō)明曲線要比prev_pt = pt;imshow("原圖", src);}//點(diǎn)擊右鍵,截取所選區(qū)域if (event == CV_EVENT_RBUTTONUP) {Mat dst;//畫線閉合區(qū)域被白色填充顯示在原始圖像上floodFill(foreground_img, Point(x, y), Scalar(255));// img中被FG_mask掩蓋后的圖像附到FG中顯示 src.copyTo(dst, foreground_img); namedWindow("ROI", 0);imshow("ROI", dst);} } int main() {Mat image = imread("4.jpg");//初始化前景和背景模板 foreground_img = Mat(image.size(), CV_8UC1, Scalar(0)); image.copyTo(src);//顯示原圖namedWindow("原圖", 0);imshow("原圖", src); cvSetMouseCallback("原圖", on_mouse, 0);waitKey(0);return 0; }結(jié)果
1.運(yùn)行之后,按下鼠標(biāo)左鍵,對(duì)著要選擇的區(qū)域拖動(dòng)鼠標(biāo)描邊,閉合之后松開(kāi)左鍵,點(diǎn)擊右鍵,得到ROI區(qū)域。
2.如果不閉合,按漫水填充的算法,會(huì)得到整張圖像。
總結(jié)
以上是生活随笔為你收集整理的OpenCV图像处理使用笔记(一)——使用鼠标选取任何形状的ROI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu 16.04下Caffe-S
- 下一篇: OpenCV图像处理使用笔记(二)——图