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

作者:Vertira 时间:2023-07-27 15:29:58 

话不多说,直接上代码

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实现在图像上绘制矩形

来源:https://blog.csdn.net/Vertira/article/details/123631185

标签:Python,OpenCV,图像,矩形
0
投稿

猜你喜欢

  • 使用python实现ftp的文件读写方法

    2022-02-06 11:25:03
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • OpenCV机器学习MeanShift算法笔记分享

    2021-06-04 18:54:54
  • asp如何创建一个Exchange用户?

    2009-11-14 20:52:00
  • Python中Dict两种实现的原理详解

    2022-11-13 06:20:29
  • 对TensorFlow的assign赋值用法详解

    2023-03-18 22:52:56
  • Python实现自定义读写分离代码实例

    2023-04-19 14:34:57
  • python调用cmd命令行制作刷博器

    2023-07-26 15:18:35
  • 解决vue请求接口第一次成功,第二次失败问题

    2023-07-02 16:59:59
  • Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解

    2023-03-13 09:28:44
  • Mootools 1.2教程(15)——滚动条(Slider)

    2008-12-09 17:35:00
  • CSS Sprites对CSS布局的意义、优点和缺点介绍

    2008-07-14 07:22:00
  • 基于Pytorch实现的声音分类实例代码

    2021-01-04 21:42:28
  • 基于SQL Server OS的任务调度机制详解

    2024-01-14 22:17:59
  • Python yield的用法实例分析

    2022-08-03 10:00:21
  • 一篇文章弄懂Python关键字、标识符和变量

    2022-11-01 17:44:42
  • Python可视化最频繁使用的10大工具总结

    2022-07-01 04:00:17
  • Python安装Imaging报错:The _imaging C module is not installed问题解决方法

    2021-05-19 06:09:39
  • PHP生成静态页面详解

    2023-11-21 06:50:43
  • 解决GD中文乱码问题

    2024-06-07 15:46:19
  • asp之家 网络编程 m.aspxhome.com