opencv的抠图程序
如题,先看看效果:
原图
效果图:
掩模:
废话不多说,看代码:
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
// 作者:江简哥
//----------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// opencv_drawroi.cpp : 定义控制台应用程序的入口点。
//
using namespace std;
using namespace cv;
CvPoint prev_pt = { -1, -1 };
Mat img;
Mat img_mask;
Mat dst;
void on_mouse(int event, int x, int y, int flags, void*)
{
if (!img.data)
return;
if (event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON)) //判断事件为松开鼠标左键或者不是左拖拽
{
prev_pt = cvPoint(-1, -1);
}
else if (event == CV_EVENT_LBUTTONDOWN) //判断为按下左键
{
prev_pt = cvPoint(x, y);
}
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)) //判断移动鼠标并且左拖拽
{
CvPoint pt = cvPoint(x, y);
if (prev_pt.x < 0)
{
prev_pt = pt;
}
line(img_mask, prev_pt, pt, Scalar::all(0), 2, 8, 0); //模板上划线
line(img, prev_pt, pt, Scalar::all(255), 2, 8, 0); //原图上划线
prev_pt = pt;
imshow("image", img);
imshow("mask", img_mask);
}
if (event == CV_EVENT_RBUTTONUP)
{
floodFill(img_mask, Point(x, y), Scalar::all(0));//填充抠图模板
imshow("mask", img_mask);
addWeighted(img, 1, img_mask, 1, 0, dst);
imshow("dst", dst);
}
}
int main(int argc, char* argv[])
{
Mat image = imread("cj.jpg");
image.copyTo(img);
//将模板设置成白色
img_mask=image.clone();
img_mask.setTo(Scalar::all(255));
//显示原图
imshow("image", img);
imshow("mask", img_mask);
//鼠标回调函数
cvSetMouseCallback("image", on_mouse, 0);
waitKey(0);
return 0;
}