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检测网站链接是否已存在
Apr 07 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
Python离线安装PIL 模块的方法
Jan 08 Python
使用turtle绘制五角星、分形树
Oct 06 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
Python中的流程控制详解
Feb 18 Python
用Python提取PDF表格的方法
Apr 11 Python
Matplotlib绘制条形图的方法你知道吗
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
You might like
延长phpmyadmin登录时间的方法
2011/02/06 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
Three.js基础学习教程
2017/11/16 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
python django事务transaction源码分析详解
2017/03/17 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
解决python报错MemoryError的问题
2018/06/26 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
区分python中的进程与线程
2020/08/13 Python
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
四风查摆问题及整改措施
2014/10/10 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
2014年英语工作总结
2014/12/20 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
JavaScript实现栈结构详细过程
2021/12/06 Javascript