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 统计代码行数简单实例
May 04 Python
回调函数的意义以及python实现实例
Jun 20 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Pandas过滤dataframe中包含特定字符串的数据方法
Nov 07 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
Matplotlib绘制条形图的方法你知道吗
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
You might like
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
繁简字转换功能
2006/07/19 Javascript
javascript背投广告代码的完善
2008/04/08 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
Angular工具方法学习
2016/12/26 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
python opencv进行图像拼接
2020/03/27 Python
Python如何输出警告信息
2020/07/30 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
班组长安全工作职责
2014/07/15 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
python opencv通过4坐标剪裁图片
2021/06/05 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android