用鼠标在原图画矩形框抠图,直接上代码吧,改一改图片和视频的路径,试试效果。
这是视频抠图的:
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
// 作者:江简哥
//----------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// 抠图程序。
//
using namespace std;
using namespace cv;
Rect selection;
Point origin;
Mat frame;
bool selectObject;
void onMouse(int event, int x, int y, int, void*)
{
if (selectObject)
{
selection.x = MIN(x, origin.x);
selection.y = MIN(y, origin.y);
selection.width = std::abs(x - origin.x);
selection.height = std::abs(y - origin.y);
selection &= Rect(0, 0, frame.cols, frame.rows);
}
switch (event)
{
case CV_EVENT_LBUTTONDOWN://鼠标左键按下
origin = Point(x, y);
selection = Rect(x, y, 0, 0);
selectObject = true; //按下左键画矩形
break;
case CV_EVENT_LBUTTONUP:
selectObject = false; //松开左键不画
break;
default:
break;
}
}
int main(int argc, const char* argv[])
{
VideoCapture video("1.avi");
if (!video.isOpened()) {
std::cout << "open video error" << endl;
return -1;
}
namedWindow("original_windows", WINDOW_AUTOSIZE);
setMouseCallback("original_windows", onMouse, 0);
double interval = 1.0 / video.get(CV_CAP_PROP_FPS);//计算每帧时间
while (true)
{
video.read(frame);
if (frame.empty())
return -1;
if (selectObject && selection.width > 0 && selection.height > 0)
{
Mat roi(frame, selection);
imshow("ROI",roi);
bitwise_not(roi, roi);
}
imshow("original_windows", frame);
int key = waitKey(int(interval * 1000));
if (key == 27)//ESC退出
break ;
}
destroyWindow("original_windows");
return 0;
}
这里是图片抠图的代码:
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
// 作者:江简哥
//----------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// 抠图程序。
//
using namespace std;
using namespace cv;
Rect selection;
Point origin;
Mat frame;
bool selectObject;
void onMouse(int event, int x, int y, int, void*)
{
if (selectObject)
{
selection.x = MIN(x, origin.x);
selection.y = MIN(y, origin.y);
selection.width = std::abs(x - origin.x);
selection.height = std::abs(y - origin.y);
selection &= Rect(0, 0, frame.cols, frame.rows);
}
switch (event)
{
case CV_EVENT_LBUTTONDOWN://鼠标左键按下
origin = Point(x, y);
selection = Rect(x, y, 0, 0);
selectObject = true; //按下左键画矩形
break;
case CV_EVENT_LBUTTONUP:
selectObject = false; //松开左键不画
break;
default:
break;
}
}
int main(int argc, const char* argv[])
{
frame= imread("cj.jpg");
if (!frame.data) {
std::cout << "open picture error" << endl;
return -1;
}
namedWindow("original_windows", WINDOW_AUTOSIZE);
setMouseCallback("original_windows", onMouse, 0);
while(true){
Mat pic = frame.clone();
if ((!selectObject )&& selection.width > 0 && selection.height > 0)
{
Mat roi(frame, selection);
imshow("ROI",roi); //此处可做图片的存储工作
//bitwise_not(roi, roi);
rectangle(frame,selection,Scalar::all(255),2);
}
imshow("original_windows", frame);
int key = waitKey(10);
if (key == 27) break; //ESC退出
}
destroyWindow("original_windows");
return 0;
}