cv2.drawContours返回报错

本文介绍在使用OpenCV进行轮廓查找时遇到的cv2.error:OpenCV Assertion failed问题,重点讲解了从cv3版本变化后findContours函数返回值的调整,并提供了相应的代码修改建议。通过将索引改为0来解决大部分版本的报错问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-c2l3r8zm\opencv\modules\imgproc\src\drawing.cpp:2501: error: (-215:Assertion failed) npoints > 0 in function 'cv::drawContours'代码片
报错如上,代码是

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
	cv2.CHAIN_APPROX_SIMPLE)[1]

cv2.版本返回是三个值image, contours, hierarchy
3.后(具体那个版本不清楚)反回两个值,代码改成取索引0,即可解决大部分cv 3.版本的上述报错问题,改完后如下

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
	cv2.CHAIN_APPROX_SIMPLE)[0]

import cv2 import numpy as np from paddleocr import PaddleOCR def show_image(desc, image): cv2.imshow(desc, image) cv2.waitKey(0) cv2.destroyAllWindows() def reg_area_color(image): """找到原图像最多的颜色,当该颜色为红色、蓝色或绿色时返回该颜色的名称""" kernel = np.ones((35, 35), np.uint8) hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像开运算去噪 Open = cv2.morphologyEx(hsv, cv2.MORPH_OPEN, kernel) # 统计H通道直方图 hist = cv2.calcHist([Open], [0], None, [180], [0, 180]) hist_max = np.where(hist == np.max(hist)) h_value = hist_max[0][0] # 提取出现频率最高的H值 # 颜色范围判断 if 0 < h_value < 10: # 红色区域 res_color = 'red' elif 100 < h_value < 124: # 蓝色区域 res_color = 'blue' elif 35 <= h_value <= 85: # 新增绿色区域 res_color = 'green' else: res_color = 'unknow' return res_color img = cv2.imread('D:/wk/pythonProject/456.png') # 调整图片大小 img = cv2.resize(img, (1024, 768)) # 灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) show_image('gray', gray) # 双边滤波 blf = cv2.bilateralFilter(gray, 13, 15, 15) show_image('bilateralFilter', blf) # 边缘检测 edged = cv2.Canny(blf, 30, 200) show_image('canny', edged) # 寻找轮廓(图像矩阵,输出模式,近似方法) contours, _ = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 根据区域大小排序取前十 contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10] screenCnt = None # 遍历轮廓,找到车牌轮廓 for c in contours: if cv2.contourArea(c) > 1024 * 768 * 0.05: continue # 计算轮廓周长(轮廓,是否闭合) peri = cv2.arcLength(c, True) # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标 approx = cv2.approxPolyDP(c, 0.018 * peri, True) # 获取四个顶点(即四边形, 左下/右下/右上/左上 if len(approx) == 4: # [参数]左上角纵坐标:左下角纵坐标,左上角横坐标:右上角横坐标 crop_image = img[approx[3][0][1]:approx[0][0][1], approx[3][0][0]:approx[2][0][0]] show_image('crop', crop_image) if 'blue' == reg_area_color(crop_image): screenCnt = approx break # 如果找到了四边形 if screenCnt is not None: # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细) cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3) show_image('contour', img) """遮罩""" # 创建一个灰度图一样大小的图像矩阵 mask = np.zeros(gray.shape, np.uint8) # 将创建的图像矩阵的车牌区域画成白色 cv2.drawContours(mask, [screenCnt], 0, 255, -1, ) # 图像位运算进行遮罩 mask_image = cv2.bitwise_and(img, img, mask=mask) show_image('mask_image', mask_image) """图像剪裁""" # 获取车牌区域的所有坐标点 (x, y) = np.where(mask == 255) # 获取底部顶点坐标 (topx, topy) = (np.min(x), np.min(y)) # 获取底部坐标 (bottomx, bottomy,) = (np.max(x), np.max(y)) # 剪裁 cropped = gray[topx:bottomx, topy:bottomy] show_image('cropped', cropped) """OCR识别""" # 使用CPU预加载,不用GPU ocr = PaddleOCR(use_angle_cls=True, use_gpu=False, ocr_version='PP-OCRv3') text = ocr.ocr(cropped, cls=True) for t in text: print(t[0][1]) 报错Traceback (most recent call last): File "D:\wk\pythonProject\test.py", line 85, in <module> cv2.drawContours(mask, [screenCnt], 0, 255, -1, ) cv2.error: OpenCV(4.11.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2426: error: (-215:Assertion failed) p.checkVector(2, CV_32S) > 0 in function 'cv::fillPoly' 请帮我解决
最新发布
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值