python-opencv,利用ROI截取图象并输出时,鼠标只能从左上到右下画图,不然就会提示错误

# -*- 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'

左边那个是鼠标从左上向右下画的,右边这个是从右向左画的就出现了错误,我知道此代码无法实现,想问问有什么办法可以随意画圆并实现的,不利用坐标,用圆心和半径等等类似的

opencv里面基本上都是左上到右下的判断,如果你需要从右下到左上,加个判断就ok了。


if y1>y:
    y1,y=y,y1
if x1>x:
    x1,x=x,x1
#在这前面判断下y1和y,x1和x的大小
ROI = temp[y1:y, x1:x] #---y1:y2, x1:x2