# -*- coding: cp936 -*-
import cv2
import numpy as np
flag = False
x1 = y1 = 0
##Alt+3
def screenShot(event, x, y, flags, param):
global x1, y1, flag, img, temp
if event == cv2.EVENT_LBUTTONDOWN: #鼠标左键按下
flag = True #表示当前鼠标左键是按下的
x1 = x
y1 = y
elif event==cv2.EVENT_MOUSEMOVE: #鼠标移动
if(flag):
img = temp.copy()#原图复制(把绘制的圆清空)
# cv2.circle(img, ((x + x1) // 2, (y + y1) // 2), max(abs(x - x1), abs(y - y1)) // 2, (0, 255, 255), 2)
cv2.circle(img, (int((x + x1) // 2), int((y + y1) // 2)), int(np.sqrt(abs(x - x1) ** 2 + abs(y - y1) ** 2) // 2), (0, 255, 255), 2)
elif event == cv2.EVENT_LBUTTONUP: #鼠标左键弹起
temp = img.copy()
flag = False
ROI = temp[y1:y, x1:x] #---y1:y2, x1:x2
cv2.imshow('ROI', ROI)
cv2.imwrite('ROI.bmp', ROI)
# cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),2)
img=cv2.imread('img/car.jpg') #读取图像
temp = img.copy() #原图备份
cv2.namedWindow('screenShot')
cv2.setMouseCallback('screenShot', screenShot)
while(1):
cv2.imshow('screenShot', img)
if cv2.waitKey(1)&0xFF == 27: #Esc按下退出
break
cv2.destroyAllWindows()
错误:
Traceback (most recent call last):
File "D:\Tools\Pycharm\workspace\demo\circle.py", line 26, in screenShot
cv2.imshow('ROI', ROI)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wvn_it83\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
左边那个是鼠标从左上向右下画的,右边这个是从右向左画的就出现了错误,我知道此代码无法实现,想问问有什么办法可以随意画圆并实现的,不利用坐标,用圆心和半径等等类似的