Python OpenCV断言失败:(-215:断言失败)npoints>;=0&&;(深度==CV_32F |深度==CV_32S)

Python OpenCV断言失败:(-215:断言失败)npoints>;=0&&;(深度==CV_32F |深度==CV_32S),python,opencv,opencv-contour,Python,Opencv,Opencv Contour,我在上找到了以下代码: 当我尝试运行代码时,出现以下错误: [INFO] processing image 1/9955 Traceback (most recent call last): File "extract_single_letters_from_captchas.py", line 47, in <module> (x, y, w, h) = cv2.boundingRect(contour) cv2.error: OpenCV(4.0.0) /Users/

我在上找到了以下代码:

当我尝试运行代码时,出现以下错误:

[INFO] processing image 1/9955
Traceback (most recent call last):
  File "extract_single_letters_from_captchas.py", line 47, in <module>
    (x, y, w, h) = cv2.boundingRect(contour)
cv2.error: OpenCV(4.0.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/shapedescr.cpp:741: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'pointSetBoundingRect'
[INFO]处理图像1/9955
回溯(最近一次呼叫最后一次):
文件“从captchas.py中提取单个字母”,第47行,在
(x,y,w,h)=cv2.边界矩形(轮廓)
cv2.error:OpenCV(4.0.0)/Users/travis/build/skvark/OpenCV python/OpenCV/modules/imgproc/src/shapedscr.cpp:741:error:(-215:断言失败)函数“pointSetBoundingRect”中的npoints>=0&(depth==cv32f||depth==cv32s)
我曾尝试在StackOverflow上搜索解决方案,但没有找到任何类似的解决方案


编辑(见评论):

  • 类型(轮廓[0])
    =

  • len(轮廓)
    =
    4


    • 这是在做错误的事情:

      如果imutils.is_cv2()为等高线[1],则等高线=等高线[0]
      imutils.is_cv2()
      正在返回
      False
      ,即使它应该返回
      True
      。如果不介意删除此依赖项,请更改为:

      contours, _ = cv.findContours()
      
      等高线=等高线[0]
      

      我找到了原因。可能,您所遵循的教程是在OpenCV 4发布之前发布的。OpenCV 3更改为返回
      图像、轮廓、层次
      ,而返回
      轮廓、层次
      。因此,在OpenCV 4之前,正确的说法是,如果使用OpenCV 2,它应该是
      等高线[0]
      否则
      等高线[1]
      。如果您仍希望具有此“兼容性”,可以更改为:

      contours, _ = cv.findContours()
      
      contours=轮廓[1]如果imutils.is_cv3()其他轮廓[0]
      
      【OpenCV 3更改了cv2.findContours(…)以返回图像、轮廓、层次结构】
      这个内容对我很有帮助。我在前面添加了一个新变量,并修复了所有错误。

      这是因为opencv python版本4.0.0。如果希望在不更改代码的情况下修复此问题,请将opencv python降级为3.4.9.31版

      • 卸载opencv python

        pip卸载opencv python

      • 安装opencv python==3.4.9.31

        pip安装opencv python==3.4.9.31

      如果遇到函数“pointSetBoundingRect”的问题,则需要安装“opencv python headless”

      pip install opencv-python-headless==3.4.9.31
      

      在OpenCV4中,cv2.findContours只有2个返回值。 等高线是第一个值


      请注意,我添加了下划线以忽略层次结构的另一个返回值,我用以下方式编写了相同的代码:

      _, contours, hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
      
      我的代码工作正常。我认为之前它返回了2个变量,现在我们必须把它分解成3个变量。如果这不起作用,请尝试以下操作:

      _, contours, _ = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
      
      这应该行得通

      有关更多信息,您可以访问OpenCV文档页面:


      我希望这会对你有所帮助。

      原因在于findContours()

       (x, y, w, h) = cv2.boundingRect(contour.astype(np.int))
      
      在OpenCV版本3中,我们写道:

      _, contours, _ = cv.findContours()
      
      在OpenCV版本4中,我们更改为:

      contours, _ = cv.findContours()
      
      使用任何一种方法都可以解决问题

      或者,我们可以使用这些命令稳定OpenCV版本,假设您安装了
      anaconda

      conda install -c conda-forge opencv=4.1.0 
      
      pip install opencv-contrib-python  
      

      请添加
      len(contour)
      type(contour[0])
      。非常感谢您的快速回复,我刚刚更新了我的问题。如果imutils.is_cv2()else contours[1]@BahramdunAdil感谢您的快速回复,现在它给我以下错误:
      回溯(最近的一次呼叫):文件“extract_single_letters_from_captchas.py”,第49行,in(x,y,w,h)=cv2.boundingRect(contour)TypeError:Expected cv::UMat for argument“array”
      @Fozoro我更新了我的答案,并提供了一些信息,以防您好奇:)@Fozoro很乐意帮助,但是现在我很好奇为什么他们在OpenCV 3上更改了这个输出:)如果我发现了关于it@Fozoro我想不出来:(更改发生在5个月前(这里是),但没有与之相关的拉取请求或问题。有时情况只是改变,我猜:)或者,您可以更改为
      imutils.is_cv2(或_better=True)
      。如果您使用opencv4@NikO但是这并不能解决只有OpenCV 3有不同的返回格式的问题,而这可能是一个有价值的提示来解决这个问题,一个好的答案也说明了解决方案。请提供示例代码来说明你的意思。这是一个注释,而不是只回答代码可能会回答这个问题,您可以通过提供代码的上下文、代码工作的原因以及一些文档参考来进一步阅读,从而显著提高回答的质量。From:“简洁是可以接受的,但更完整的解释更好。”