#include <iostream>
#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
Point prev_pt = Point(-1,-1); //定義初始座標。如果將prev_pt寫在on_mouse裏,畫的線會出問題
Mat img, BG_mask, FG_mask;
void on_mouse(int event, int x, int y, int flags, void*)
{
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);
}
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)) //移動鼠標並且左拖拽
{
Point pt = Point(x, y);
//line(BG_mask, prev_pt, pt, Scalar(0), 2, 8, 0); //背景模板上劃線
line(FG_mask, prev_pt, pt, Scalar(255), 2, 8, 0); //前景模板上劃線
line(img, prev_pt, pt, Scalar::all (255), 2, 8, 0); //原圖上劃線 Scalar::all(255)意思就是BGR通道像素值全爲255,即Scalar(255,255,255)
prev_pt = pt;//起點等於終點,說明曲線要比
imshow("image", img);//畫好線後還在原圖上顯示
}
if (event == CV_EVENT_RBUTTONUP) //右鍵UP,截取所選區域
{
Mat BG, FG;
//floodFill(BG_mask, Point(x, y), Scalar(0)); //畫線閉合區域被黑色填充顯示在BG_mask上
floodFill(FG_mask, Point(x, y), Scalar(255));//畫線閉合區域被白色填充顯示在FG_mask上
//imshow("BG_mask", BG_mask); //顯示黑色模板
imshow("FG_mask", FG_mask); //顯示白色填充模板
//img.copyTo(BG, BG_mask);//img中被BG_mask掩蓋後的圖像附到BG中顯示
img.copyTo(FG, FG_mask);// img中被FG_mask掩蓋後的圖像附到FG中顯示
imshow("FG", FG);
//imshow("BG", BG);
}
}
int main()
{
Mat image = imread("E:\\opencvTest\\11.jpg");
//初始化前景和背景模板
FG_mask = Mat(image.size(), CV_8UC1, Scalar(0)); //FG_mask是背景純白與img等大小的模板
//BG_mask = Mat(image.size(), CV_8UC1, Scalar(255)); //BG_mask是背景純黑與img等大小的模板
image.copyTo(img);//把image附到img圖上顯示
imshow("image", img); //顯示原圖
//鼠標回調函數
cvSetMouseCallback("image", on_mouse, 0);
waitKey(0);
return 0;
}
任務3:鼠標獲取任意ROI區域
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.