AomCC 2021-04-07 03:36 采纳率: 14.3%
浏览 96
已采纳

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'

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

  • 写回答

1条回答 默认 最新

  • 爱晚乏客游 2021-04-07 08:57
    关注

    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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题