Opencv调用Camera在视频中静态、动态方式绘制矩形框ROI

Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是“静态的”,一种是“动态的”。

静态的是指在绘制过程中,视频暂停播放,画面定格在鼠标左键单击上去时候播放的画面,这时候按着鼠标左键并拖动出一个感兴趣的区域,鼠标左键抬起完成矩形框的绘制。在整个绘制过程中,矩形是连续显示出来的,跟随鼠标位置变化而变化。

过程和实现都很简单,以下是具体代码实现,主要用到了鼠标响应事件:

#include "core/core.hpp"  
#include "highgui/highgui.hpp"  
#include "imgproc/imgproc.hpp"  
#include<iostream>  

using namespace cv;
using namespace std;

Mat frame;
Mat frameCopy; //绘制矩形框时用来拷贝原图的图像
bool leftButtonDownFlag = false; //左键单击后视频暂停播放的标志位
Point originalPoint; //矩形框起点
Point processPoint; //矩形框终点

void onMouse(int event, int x, int y, int flags, void* ustc); //鼠标回调函数

int main()
{
	VideoCapture cap;
	cap.open(0);
	if (!cap.isOpened())
		return 0;
	double fps = cap.get(CV_CAP_PROP_FPS); //获取视频帧率
	double pauseTime = 1000 / fps; //两幅画面中间间隔
	namedWindow("Cap");
	setMouseCallback("Cap", onMouse);

	int count = 0;
	while (1)
	{
		count++;
		if (!leftButtonDownFlag) //判定鼠标左键没有按下,采取播放视频,否则暂停
		{
			cap >> frame;
		}

		if (waitKey(50) == 27)  //Esc键按下退出播放
		{
			break;
		}

		if (originalPoint != processPoint&&!leftButtonDownFlag)
		{
			rectangle(frame, originalPoint, processPoint, Scalar(255, 0, 0), 2);
			Mat rectImage = frame(Rect(originalPoint, processPoint)); //子图像显示
			imshow("Sub Image", rectImage);
		}
		imshow("Cap", frame);
	}
	cap.release();
}

//*******************************************************************//  
//鼠标回调函数  
void onMouse(int event, int x, int y, int flags, void *ustc)
{

	if (event == CV_EVENT_LBUTTONDOWN)
	{
		leftButtonDownFlag = true; //标志位
		originalPoint = Point(x, y);  //设置左键按下点的矩形起点
		processPoint = originalPoint;
	}
	if (event == CV_EVENT_MOUSEMOVE&&leftButtonDownFlag)
	{
		frameCopy = frame.clone();
		processPoint = Point(x, y);
		if (originalPoint != processPoint)
		{
			//在复制的图像上绘制矩形
			rectangle(frameCopy, originalPoint, processPoint, Scalar(255, 0, 0), 2);
		}
		imshow("Cap", frameCopy);
	}
	if (event == CV_EVENT_LBUTTONUP)
	{
		leftButtonDownFlag = false;
		Mat rectImage = frame(Rect(originalPoint, processPoint)); //子图像显示
		imshow("Sub Image", rectImage);
	}

}

鼠标左键按下,此时视频画面暂停,拖动左键,绘制出需要的矩形

 

对应的,动态的是说在绘制矩形框的过程中,视频还是在正常播放的,截取的子画面是鼠标抬起时当前视频帧的画面。动态绘制不需要在鼠标事件中处理矩形框的绘制,相比静态的还更为简单一点:

#include "core/core.hpp"  
#include "highgui/highgui.hpp"  
#include "imgproc/imgproc.hpp"  
#include<iostream>  

using namespace cv;
using namespace std;

Mat image;
Mat imageCopy; //绘制矩形框时用来拷贝原图的图像
bool leftButtonDownFlag = false; //左键单击后视频暂停播放的标志位
Point originalPoint; //矩形框起点
Point processPoint; //矩形框终点

void onMouse(int event, int x, int y, int flags, void* ustc); //鼠标回调函数

int main()
{
	VideoCapture cap;
	cap.open(0);
	if (!cap.isOpened())
		return 0;
	double fps = cap.get(CV_CAP_PROP_FPS); //获取视频帧率
	double pauseTime = 1000 / fps; //两幅画面中间间隔
	namedWindow("Cap");
	setMouseCallback("Cap", onMouse);

	int count = 0;
	while (1)
	{
			count++;
			cap >> image;

			if (waitKey(50) == 27)  //Esc键按下退出播放
			{
				break;
			}

			if (originalPoint != processPoint&&!leftButtonDownFlag)
			{
				rectangle(image, originalPoint, processPoint, Scalar(255, 0, 0), 2);
			}
			imshow("Cap", image);
	}
	cap.release();
}

//*******************************************************************//  
//鼠标回调函数  
void onMouse(int event, int x, int y, int flags, void *ustc)
{

	if (event == CV_EVENT_LBUTTONDOWN)
	{
		leftButtonDownFlag = true; //标志位
		originalPoint = Point(x, y);  //设置左键按下点的矩形起点
		processPoint = originalPoint;
	}
	if (event == CV_EVENT_MOUSEMOVE&&leftButtonDownFlag)
	{
		processPoint = Point(x, y);
	}
	if (event == CV_EVENT_LBUTTONUP)
	{
		leftButtonDownFlag = false;
		Mat rectImage = image(Rect(originalPoint, processPoint)); //子图像显示
		imshow("Sub Image", rectImage);
	}
}

鼠标左键按下,视频仍会继续播放,拖动鼠标,画出矩形框

原文出处:https://blog.csdn.net/dcrmg/article/details/52541174(略作修改)

### 回答1: 使用Python OpenCV绘制矩形框的方法如下: 1. 导入OpenCV库 ``` import cv2 ``` 2. 读取图像 ``` img = cv2.imread('image.jpg') ``` 3. 定义矩形框的位置和大小 ``` x, y, w, h = 100, 100, 200, 200 ``` 4. 绘制矩形框 ``` cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) ``` 其,第一个参数是要绘制矩形框的图像,第二个参数是矩形框的左上角坐标,第三个参数是矩形框的右下角坐标,第四个参数是矩形框的颜色,第五个参数是矩形框的线宽。 5. 显示图像 ``` cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 完整代码如下: ``` import cv2 img = cv2.imread('image.jpg') x, y, w, h = 100, 100, 200, 200 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 回答2: PythonOpenCV库是许多计算机视觉和图像处理项目的首选库之一。绘制矩形框OpenCV的一项非常常见的操作。以下是使用Python和OpenCV绘制矩形框的步骤。 1. 安装OpenCV库: 在Python环境下安装OpenCV库,最简单的方法是使用pip命令。 可以在终端窗口使用以下命令安装OpenCV库: `pip install opencv-python` 2. 导入OpenCV库和其他必要的库: 在Python代码,需要导入以下库: ``` import cv2 import numpy as np ``` 3. 读取图像: 使用OpenCV库的imread()函数读取所需的图像。例如: ``` img = cv2.imread("image.jpg") ``` 4. 绘制矩形框: 使用cv2.rectangle()函数绘制矩形框。此函数需要以下参数: ``` cv2.rectangle(image, start_point, end_point, color, thickness) ``` - image:原始图像。 - start_point: 矩形的左上角坐标。 - end_point: 矩形的右下角坐标。 - color: 矩形框的颜色。 - thickness: 矩形框的线条粗细。(如果为负数,则矩形框将填充为所选颜色。) 例如,为以下图像绘制一个矩形框: ![image](https://user-images.githubusercontent.com/60111143/132330100-8268d4cd-c52e-4a62-a9fd-b991dbd6bdae.png) 代码如下: ``` img = cv2.imread("image.jpg") start_point = (120, 120) end_point = (500, 500) color = (255, 0, 0) # 蓝色 thickness = 5 cv2.rectangle(img, start_point, end_point, color, thickness) cv2.imshow("Image with rectange", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 输出结果如下图所示: ![image](https://user-images.githubusercontent.com/60111143/132330285-51be0b5d-6771-4238-99f3-5f96d183ca6e.png) 5. 显示图像: 使用cv2.imshow()函数显示结果图像。此函数需要以下参数: ``` cv2.imshow(window_name, image) ``` - window_name: 窗口的名称(一个字符串)。 - image: 想要显示的图像或帧。 6. 键盘绑定: 使用cv2.waitKey()函数等待键盘上的任何键被按下。如果在等待期间未按下任何键,操作将退出并关闭窗口。此函数需要一个整数参数,表示等待时间(以毫秒为单位)。 7. 销毁窗口: 使用cv2.destroyAllWindows()函数,关闭并销毁所有打开的窗口。 上述步骤的代码示例可以在Python成功绘制矩形框,并展示在窗口。可以通过对start_point和end_point的值进行更改,调整矩形框的大小和位置,然后再次运行代码即可。 ### 回答3: Python是一种强大的编程语言,广泛应用于科学技术领域的数据分析、机器学习、人工智能等方面。而OpenCV是一个专业用于计算机视觉的开源库,为Python提供了一系列强大的图像处理功能,大大简化了图像处理的操作。 绘制矩形框OpenCV的一个常用操作,可以用于图像分析、目标检测等领域。在Python使用OpenCV绘制矩形框,有以下几种方法: 1. 使用cv2.rectangle()函数。该函数的参数包括:图像、矩形框的左上角坐标、矩形框的右下角坐标、颜色、线条粗细等。例如,以下代码可以在图像画出一个左上角坐标为(50, 50),右下角坐标为(150, 150)的红色矩形框。 import cv2 img = cv2.imread('test.jpg') cv2.rectangle(img, (50, 50), (150, 150), (0, 0, 255), 2) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() 2. 使用matplotlib库的pyplot模块。Matplotlib是Python一个非常流行的绘图库,它可以实现可视化效果。在使用pyplot绘制矩形框时,需要先将OpenCV读入的图像转为RGB格式。例如,以下代码同样可以在图像画出一个左上角坐标为(50, 50),右下角坐标为(150, 150)的红色矩形框。 import cv2 from matplotlib import pyplot as plt img = cv2.imread('test.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.gca().add_patch(plt.Rectangle((50, 50), 100, 100, edgecolor='r', fill=None, linewidth=2)) plt.show() 3. 使用Pillow库。Pillow是Python非常好用的图像处理库,可以实现图像的读取、保存、转换等功能。使用Pillow绘制矩形框时,需要先将OpenCV读入的图像转为Pillow格式。例如,以下代码同样可以在图像画出一个左上角坐标为(50, 50),右下角坐标为(150, 150)的红色矩形框。 import cv2 from PIL import Image, ImageDraw img = cv2.imread('test.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = Image.fromarray(img) draw = ImageDraw.Draw(img) draw.rectangle((50, 50, 150, 150), outline='red', width=2) img.show() 综上所述,Python使用OpenCV绘制矩形框的方法有多种,开发者可以根据实际需求灵活选择。无论使用哪种方法,都需要注意矩形框的大小、颜色、线条粗细等参数设置,以达到最佳的视觉效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值