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中exit、return、sys.exit()等使用实例和区别
May 28 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
python3中类的继承以及self和super的区别详解
Jun 26 Python
python读写csv文件方法详细总结
Jul 05 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
Python函数参数定义及传递方式解析
Jun 10 Python
Matplotlib绘制条形图的方法你知道吗
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
You might like
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
JS表的模拟方法
2015/02/05 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
用Python写冒泡排序代码
2016/04/12 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Python语言快速上手学习方法
2018/12/14 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
浙大网新C/C++面试解惑
2015/05/27 面试题
SQL Server面试题
2016/10/17 面试题
幼儿园运动会入场词
2014/02/10 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
信仰心得体会
2014/09/05 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
优秀大学生自荐信
2015/03/26 职场文书