Python+OpenCV实现在图像上绘制矩形


Posted in Python onMarch 21, 2022

话不多说,直接上代码

import copy
import cv2
import numpy as np
 
WIN_NAME = 'draw_rect'
 
 
class Rect(object):
    def __init__(self):
        self.tl = (0, 0)
        self.br = (0, 0)
 
    def regularize(self):
        """
        make sure tl = TopLeft point, br = BottomRight point
        """
        pt1 = (min(self.tl[0], self.br[0]), min(self.tl[1], self.br[1]))
        pt2 = (max(self.tl[0], self.br[0]), max(self.tl[1], self.br[1]))
        self.tl = pt1
        self.br = pt2
 
 
class DrawRects(object):
    def __init__(self, image, color, thickness=1):
        self.original_image = image
        self.image_for_show = image.copy()
        self.color = color
        self.thickness = thickness
        self.rects = []
        self.current_rect = Rect()
        self.left_button_down = False
 
    @staticmethod
    def __clip(value, low, high):
        """
        clip value between low and high
        Parameters
        ----------
        value: a number
            value to be clipped
        low: a number
            low limit
        high: a number
            high limit
        Returns
        -------
        output: a number
            clipped value
        """
        output = max(value, low)
        output = min(output, high)
        return output
 
    def shrink_point(self, x, y):
        """
        shrink point (x, y) to inside image_for_show
        Parameters
        ----------
        x, y: int, int
            coordinate of a point
        Returns
        -------
        x_shrink, y_shrink: int, int
            shrinked coordinate
        """
        height, width = self.image_for_show.shape[0:2]
        x_shrink = self.__clip(x, 0, width)
        y_shrink = self.__clip(y, 0, height)
        return (x_shrink, y_shrink)
 
    def append(self):
        """
        add a rect to rects list
        """
        self.rects.append(copy.deepcopy(self.current_rect))
 
    def pop(self):
        """
        pop a rect from rects list
        """
        rect = Rect()
        if self.rects:
            rect = self.rects.pop()
        return rect
 
    def reset_image(self):
        """
        reset image_for_show using original image
        """
        self.image_for_show = self.original_image.copy()
 
    def draw(self):
        """
        draw rects on image_for_show
        """
        for rect in self.rects:
            cv2.rectangle(self.image_for_show, rect.tl, rect.br,
                          color=self.color, thickness=self.thickness)
 
    def draw_current_rect(self):
        """
        draw current rect on image_for_show
        """
        cv2.rectangle(self.image_for_show,
                      self.current_rect.tl, self.current_rect.br,
                      color=self.color, thickness=self.thickness)
 
 
def onmouse_draw_rect(event, x, y, flags, draw_rects):
    if event == cv2.EVENT_LBUTTONDOWN:
        # pick first point of rect
        print('pt1: x = %d, y = %d' % (x, y))
        draw_rects.left_button_down = True
        draw_rects.current_rect.tl = (x, y)
    if draw_rects.left_button_down and event == cv2.EVENT_MOUSEMOVE:
        # pick second point of rect and draw current rect
        draw_rects.current_rect.br = draw_rects.shrink_point(x, y)
        draw_rects.reset_image()
        draw_rects.draw()
        draw_rects.draw_current_rect()
    if event == cv2.EVENT_LBUTTONUP:
        # finish drawing current rect and append it to rects list
        draw_rects.left_button_down = False
        draw_rects.current_rect.br = draw_rects.shrink_point(x, y)
        print('pt2: x = %d, y = %d' % (draw_rects.current_rect.br[0],
                                       draw_rects.current_rect.br[1]))
        draw_rects.current_rect.regularize()
        draw_rects.append()
    if (not draw_rects.left_button_down) and event == cv2.EVENT_RBUTTONDOWN:
        # pop the last rect in rects list
        draw_rects.pop()
        draw_rects.reset_image()
        draw_rects.draw()
 
 
if __name__ == '__main__':
    #image = np.zeros((256, 256, 3), np.uint8)
    image = cv2.imread("111.jpg")
    draw_rects = DrawRects(image, (0, 255, 0), 2)
    cv2.namedWindow(WIN_NAME, 0)
    cv2.setMouseCallback(WIN_NAME, onmouse_draw_rect, draw_rects)
    while True:
        cv2.imshow(WIN_NAME, draw_rects.image_for_show)
        key = cv2.waitKey(30)
        if key == 27:  # ESC
            break
    cv2.destroyAllWindows()

运行效果

Python+OpenCV实现在图像上绘制矩形

补充

当然Python+OpenCV不仅能做到在图像上绘制任意大小矩形,还能实现鼠标点击图像时会显示其坐标值

下面是实现代码

import cv2
import numpy as np
 
img = cv2.imread("111.jpg")
 
 
# print img.shape
 
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        xy = "%d,%d" % (x, y)
        print
        xy
        cv2.circle(img, (x, y), 1, (255, 0, 0), thickness=-1)
        cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                    1.0, (255, 255, 255), thickness=1)
        cv2.imshow("image", img)
 
 
cv2.namedWindow("image",cv2.WINDOW_KEEPRATIO)
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)
cv2.imshow("image", img)
 
while (True):
    try:
        cv2.waitKey(100)
    except Exception:
        cv2.destroyWindow("image")
        break
 
cv2.waitKey(0)
cv2.destroyAllWindow()

运行结果:

Python+OpenCV实现在图像上绘制矩形

以上就是Python+OpenCV实现在图像上绘制矩形的详细内容,更多关于Python OpenCV的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python二叉树的实现实例
Nov 21 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
python直接访问私有属性的简单方法
Jul 25 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
python list转矩阵的实例讲解
Aug 04 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
python如何制作缩略图
Apr 30 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
python对execl 处理操作代码
Jun 22 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 Python
Matplotlib绘制条形图的方法你知道吗
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
You might like
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
php读取3389的脚本
2014/05/06 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
js实现商城星星评分的效果
2015/12/29 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
21行Python代码实现拼写检查器
2016/01/25 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
Python:slice与indices的用法
2019/11/25 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
财政专业求职信范文
2014/02/19 职场文书
初一学生评语大全
2014/04/24 职场文书
校园安全演讲稿
2014/05/09 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
监理中标通知书
2015/04/16 职场文书
从事会计工作年限证明
2015/06/23 职场文书
python 实现定时任务的四种方式
2021/04/01 Python