文章目录
- opencv常用功能
- opencv的报错及其解决方案
- 本地服务直接崩溃 Process finished with exit code -1073741819 (0xC0000005)
- EdgeDrawing'无法调用 AttributeError: module 'cv2.ximgproc' has no attribute 'createEdgeDrawing'
- AttributeError: module 'jinja2' has no attribute 'contextfunction'
- PermissionError: [WinError 5] 拒绝访问。
- 明明已经安装了opencv-contrib-python,但是报错:AttributeError: module 'cv2' has no attribute 'imdecode'
- error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
- TypeError: only size-1 arrays can be converted to Python scalars
- TypeError: Scalar value for argument 'color' is not numeric in openCV
- 性能测试工具
opencv常用功能
1. 灰度转化
cv2.imread() # 接口读图像,读进来直接是BGR 格式数据格式在 0~255,通道格式为(W,H,C)
cv2.cvtColor(p1,p2) # 颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
2. 二值化(cv2.threshold)
注意!!这个函数一定会返回两个值,且第二个从是图片。漏了图片显示会报错!!
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
- 原型:threshold(src,thresh,maxval,type,dst=None)
- 作用:将图像的每个像素点进行二值化
- 参数:thresh,阈值(最小值)。maxval,二值化的最大取值。
type,二值化类型,一般设为0,也可以取以下的值:
3. 绘制矩形框(cv2.rectangle)
cv2.rectangle(image, pt1, pt2, color, thickness, lineType, shift)
- image:要在其上绘制矩形的图像。
- pt1:矩形的左上角顶点的坐标,可以用一个元组 (x1, y1) 表示。
- pt2:矩形的右下角顶点的坐标,可以用一个元组 (x2, y2) 表示。
- color:矩形的颜色,可以是一个表示颜色的元组 (B, G, R),其中 B、G 和 R 分别表示蓝色、绿色和红色的强度。颜色值的范围是 0 到 255。
- thickness:矩形线的粗细,默认值为 1。如果指定为 -1,则表示填充矩形
- lineType:线的类型,默认值为 cv2.LINE_8,表示 8 连接线。还可以选择 cv2.LINE_4(4 连接线)或 cv2.LINE_AA(抗锯齿线)。
- shift:坐标点的小数位数,默认值为 0。
示例:
# 寻找边界
contours, hierarchy = cv2.findContours(tophat, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#将边界的矩形区域选出来
boxes = [cv2.boundingRect(c) for c in contours]
for box in boxes:
x, y, w, h = box # x, y表示最右上角点,w是矩形的宽,h是矩形的高
cv2.rectangle(tophat, (x, y), (x+w, y+h), (153, 153, 0), 0)
# 以下代码可以将矩形框的内容填充
# 核心是 cv2.FILLED
cv2.rectangle(img2, (x, y), (x + w, y + h), background_color, cv2.FILLED)
4. 找轮廓(cv2.findContours)
cv2.findContours()函数用于在二进制图像中查找轮廓, 用这个函数前,一定要将图片二值化
contours, hierarchy = cv2.findContours(image, mode, method)
- image: 输入的二进制图像,通常为灰度图像或者经过阈值处理后的图像。
- mode: 轮廓检索模式,指定轮廓的层级关系。常用的模式有:
- cv2.RETR_EXTERNAL: 只检测最外层的轮廓。
- cv2.RETR_LIST: 检测所有的轮廓,不建立轮廓的层级关系。
- cv2.RETR_TREE: 检测所有的轮廓,并且建立轮廓的层级关系。
- method: 轮廓逼近方法。常用的方法有:
- cv2.CHAIN_APPROX_NONE: 保存所有的轮廓点。
- cv2.CHAIN_APPROX_SIMPLE: 仅保存轮廓的端点。
函数返回值:
- contours:检测到的轮廓,以一个列表形式返回。每个轮廓由一系列点组成。
- hierarchy:轮廓的层级关系,以一个多维数组的形式返回。
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
face_planks = []
# 遍历所有轮廓
for contourIndex, contour in enumerate(contours):
# 判断轮廓是否为内轮廓
if hierarchy[0][contourIndex][2] == -1 and hierarchy[0][contourIndex][3] != -1:
# 绘制轮廓
x, y, w, h = cv2.boundingRect(contour)
5. 对图片进行切片
# 规则:前面是y坐标,后面是x坐标。切片的时候小的值在前面,大的值在后面
img[min_y: max_y, min_x: max_x]
6. 将图片设置为指定的颜色
# 将图像转换为指定的颜色
color = (0, 0, 255) # BGR 格式的颜色,这里设置为红色
colored_image = np.full_like(image, color)
7. 绘制直线
cv2.line(img, pt1, pt2, color, thickness, lineType, shift)
- pt1: 直线的起点坐标,是一个包含两个元素的元组 (x1, y1)。
- pt2: 直线的终点坐标,是一个包含两个元素的元组 (x2, y2)。
- color: 直线的颜色,可以是一个标量(灰度图像的颜色值)或一个包含三个元素的元组 (B, G, R)(彩色图像的颜色值)。
- thickness: 直线的宽度,以像素为单位。如果为负值(例如 cv2.FILLED),则表示填充整个区域。
- lineType: 直线的类型,可以是 cv2.LINE_AA(抗锯齿线)或 cv2.LINE_8(8-connected line)等。
实际例子:
ed.detectEdges(img)
lines = ed.detectLines()
#Draw detected lines
if lines is not None: # Check if the lines have been found and only then iterate over these and add them to the image
lines = np.uint16(np.around(lines))
print("find lines!")
for i in range(len(lines)):
cv2.line(color_img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), mode_color, 2, cv2.LINE_AA)
8. 创建掩码(cv2.inRange)
cv2.inRange(src, lowerb, upperb, dst=None)
该函数用于将输入图像中的像素值限制在指定范围内,生成一个二值掩码,其中在范围内的像素值为白色(255),而在范围外的像素值为黑色(0)。通常,cv2.inRange() 用于进行颜色范围的过滤。
- lowerb: 包含三个元素的数组,指定颜色范围的下界。
- upperb: 包含三个元素的数组,指定颜色范围的上界。
- dst: 输出的二值掩码图像,与输入图像的大小和类型相同。
实际例子:
将颜色[101, 101, 101]替换成[0, 0, 0]
# 定义要替换的颜色范围
lower_bound = np.array([101, 101, 101], dtype=np.uint8)
upper_bound = np.array([101, 101, 101], dtype=np.uint8)
# 创建掩码
mask = cv2.inRange(image, lower_bound, upper_bound)
# 将指定颜色替换为[0, 0, 0]
image[mask > 0] = [0, 0, 0]
9. 创建图片(np.full)
numpy.full(shape, fill_value, dtype=None, order='C')
- shape: 数组的形状,可以是一个整数或一个整数元组。
- fill_value: 用于填充数组的常数值。
- dtype: 数组的数据类型。如果未提供,将根据 fill_value 推断数据类型。
- order: 数组在内存中的存储顺序,可以是 ‘C’(按行)、‘F’(按列)或 ‘A’(自动选择,默认)。
实际案例:
width, height = 500, 500 # 图片的宽高
color_img1 = np.full((height, width, 3), color, dtype=np.uint8)
10.图片上标注文字(cv2.putText)
cv2.putText(src, text, place, Font, Font_Size, Font_Color, Font_Overstriking)
代码示例:
import cv2 as cv
import numpy as np
# 读入图片
src = cv.imread('test.jpg')
# 调用cv.putText()添加文字
text = "Nice to see you!"
AddText = src.copy()
cv.putText(AddText, text, (200, 100), cv.FONT_HERSHEY_COMPLEX, 2.0, (100, 200, 200), 5)
opencv的报错及其解决方案
本地服务直接崩溃 Process finished with exit code -1073741819 (0xC0000005)
问题产生原因:
windows环境没有办法安装tflite_runtime==2.10.0这个版本的包,这个是tensorflow lite模型的包,如果版本不正确,本地服务就会爆炸
解决方案:
换Linux环境,因为服务端都是Linux的环境,都可以安装tflite_runtime==2.10.0这个包,且正常运行。
EdgeDrawing’无法调用 AttributeError: module ‘cv2.ximgproc’ has no attribute ‘createEdgeDrawing’
问题产生原因:
opencv-python 和 opencv-contrib-python 两个包只能存在一个。
解决方案:
卸载opencv-python这个包就可以了
AttributeError: module ‘jinja2’ has no attribute ‘contextfunction’
问题产生原因及其解决方案:
aiohttp_jinja2的版本太低了,升级到1.5问题解决
PermissionError: [WinError 5] 拒绝访问。
三步解决python PermissionError: [WinError 5]拒绝访问的情况:link
明明已经安装了opencv-contrib-python,但是报错:AttributeError: module ‘cv2’ has no attribute ‘imdecode’
问题产生原因:
不知道,反正就是安装paddlehub和paddlepaddle后,这两个包帮你同时安装很多包,包括opencv-python和opencv-contrib-python。然后我就卸载了opencv-python,接下来就出现这个报错了。但是实际上opencv-contrib-python已经包括了opencv-python的所有包了。
解决方案:
卸载opencv-contrib-python然后重新安装
error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
问题产生原因:
_src.empty() 这个表示图片是空的
解决方案:
查看路径,是不是填错了,导致读取的不存在的路径,使得图片为空。
TypeError: only size-1 arrays can be converted to Python scalars
问题产生原因:
int(get_mode(img2))
上面的get_mode()返回的其实是一个的三通道颜色,类型为np的narry,不能用int。
解决方案:
去掉int就可以了。
TypeError: Scalar value for argument ‘color’ is not numeric in openCV
问题产生原因:
rectangle 这个函数的颜色里面的值必须是int类型。
# 报错的代码
mode_color = get_mode(img2)
background_color = mode_color
# 将最大面积填充
img2 = cv2.rectangle(img2, (x, y), (x + w, y + h), mode_color, cv2.FILLED)
解决方案:
background_color = tuple(int(c) for c in mode_color)
性能测试工具
时间消耗检测 —— line_profiler
from line_profiler import LineProfiler
lp = LineProfiler() # 实例化
test_func = lp(get_wardrobe_by_dxfimg) # 选择最外层需要检验时间的函数
lp.add_function(get_dxfimg_recognition_result) # get_wardrobe_by_dxfimg里面运行的函数
test_func(data) # 运行函数,括号里面就是get_wardrobe_by_dxfimg的参数
lp.print_stats() # 打印状态
内存消耗检测 —— memory_profiler
from memory_profiler import profile
@profile() # 这就是一个装饰器,放在你想检测的函数上面即可