任務3:鼠標獲取任意ROI區域

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章