python - 在图像opencv上绘制矩形?

标签 python opencv

我已经在 python 中使用 opencv 库加载了一个图像,现在我想使用鼠标绘制一个矩形,但是在绘制矩形时,矩形应该是可见的,以便绘制它的人可以以某种方式放置它,以便对象兴趣完全在矩形中,但我的代码没有产生所需的输出

我的代码是

import os
import sys
import numpy as np
import cv2

baseDir = '/home/aman/Downloads/shirt/'

filenames = next(os.walk(baseDir))[2]

drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
tx,ty = -1,-1

def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    print 'aman'
    if event == cv2.EVENT_LBUTTONDOWN:
    drawing = True
    ix,iy = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
    if drawing == True:
        if mode == True:
            #cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            cv2.line(img, (ix,iy),(ix,y), 255, 1, 8, 0)
            cv2.line(img, (ix,iy),(x,iy), 255, 1, 8, 0)

            cv2.line(img, (ix,y),(x,y), 255, 1, 8, 0)
            cv2.line(img, (x,iy),(x,y), 255, 1, 8, 0)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

    elif event == cv2.EVENT_LBUTTONUP:
    drawing = False
    if mode == True:
        #cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        cv2.rectangle(img,(ix,y),(x,y),(0,255,0),-1)
        cv2.rectangle(img,(x,iy),(x,y),(0,255,0),-1)
    else:
        cv2.circle(img,(x,y),5,(0,0,255),-1)

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
    mode = not mode
    elif k == 27:
    break

cv2.destroyAllWindows()        

`

但是产生的输出是这样的 enter image description here

我不想要这种行为,我只想要一个矩形,而不是每个 Action 。我知道我应该修改鼠标移动事件中的代码,但问题是如何做到这一点,以便当人移动鼠标时,他能够看到完整的矩形,当他释放按钮时,矩形应该固定?

最佳答案

您可以将此过程视为在任何其他渲染 API(如 OpenGL)中进行渲染:将某些东西放在屏幕上,然后清洁它,然后在干净的区域上绘制。

在此上下文中,清理意味着恢复原始图像。借鉴它意味着添加您的矩形或其他任何东西。

因此,我建议创建一个只处理此问题的 draw 方法。每当要对呈现目标进行更改时调用它。

一个快速片段(不是真正的 python,只是伪代码):

source_image = Mat()
image = Mat()
rect = Rect()

# general logic and stuff ...

# set a mouseCallbackListener
def listener(evt):
    rect.x = evt.x   # uptade de rect properly (...)
    draw()

# apply the drawing logic
def draw():
    image = source_image.clone()
    rectangle(image, rect, Scalar(0,255,0), 1, 8, 0)
    imshow(WINDOW_NAME, image)

如果你想看一个真实的例子,这里有一段 C++11 代码,让你绘制多个三角形,然后将它们的中心作为输出以响应键盘输入:https://gist.github.com/cirocosta/9f7a57bddb40c4e5cbca

Example of Rectangle Selection

关于python - 在图像opencv上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236932/

相关文章:

python - 将 JSON 数据转换为 CSV 格式

python - Python 中的圆弧插值

python - 使用 OpenCV 和 Python 从 HSV 图像检测颜色时遇到问题

python - 如何将opencv人脸检测边界框坐标转换为dlib人脸检测边界框坐标?

java - 如何将C++运算符转换为Java

image - 使用pointPolygonTest检查Point是否落入轮廓内总是在嵌套形状中返回true

python - 检查变量是否可以解包

python3 -m venv : how to specify Python point release/version?

python - 使用 Pandas 在 Python 中处理大型 SQL 查询?

python - 谁能帮我用 python 读取不断更新的视频文件?