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 调用Java实例详解
Jun 02 Python
python读写LMDB文件的方法
Jul 02 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
tensorflow如何批量读取图片
Aug 29 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python脚本导出为exe程序的方法
Mar 25 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
python接口自动化框架实战
Dec 23 Python
Python实战之实现康威生命游戏
Apr 26 Python
Matplotlib绘制条形图的方法你知道吗
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
You might like
php获得当前的脚本网址
2007/12/10 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
使用js 设置url参数
2013/07/08 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
javascript计时器详解
2015/02/28 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
Python编码类型转换方法详解
2016/07/01 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python网络应用开发知识点浅析
2019/05/28 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python适配器模式代码实现解析
2019/08/02 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
python自动化发送邮件实例讲解
2021/01/04 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
房产销售经理职责
2013/12/20 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
环保标语口号
2014/06/13 职场文书
领导欢迎词范文
2015/01/26 职场文书
委托书格式要求
2015/01/28 职场文书
实习证明格式范文
2015/06/16 职场文书
导游词之吉林吉塔
2019/11/11 职场文书
导游词之井冈山
2019/11/20 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技