OpenCV中给视频和图片用矩形来局部截图

用鼠标在原图画矩形框抠图,直接上代码吧,改一改图片和视频的路径,试试效果。
这是视频抠图的:

//-----------------------------------【头文件包含部分】---------------------------------------  
//      描述:包含程序所依赖的头文件  
//		作者:江简哥
//----------------------------------------------------------------------------------------------   
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值