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()  # 这就是一个装饰器,放在你想检测的函数上面即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值