开源计算机视觉库 OpenCV 4.9.0 已于2023年12月29日正式发布。
此次发布有DNN模块对ONNX Attention、Einsum等层的支持、新的fastGEMM实现、transformers的实验性支持等诸多亮点。
OpenCV 4.9.0 更新内容:
(来自OpenCV中国团队以及中国社区的贡献以🍄标出)
DNN模块:
-
实验性transformers支持 🍄
-
#24476 ONNX Attention层支持 🍄
-
#24037 ONNX Einsum层支持
-
#23987 OpenVINO后端对INT8模型的支持
-
#24092 ONNX Gather Elements层支持
-
#24378 ONNX InstanceNorm layer层支持 🍄
-
#24295 用cv::broadcast对ONNX Expand层重构 🍄
-
#24463 #24577 #24483 改进DNN图融合
-
#23897 #24694 #24509 新的fastGEMM实现 🍄
-
#23654 ARM上Winograd fp16的优化 🍄
-
Yolo系列模型支持的测试和bug修复 🍄
-
CUDA后端新的层的支持和bug修复: GEMM, Gelu, Add 🍄
-
#24462 CANN后端: bug修复, HardSwish, LayerNormalization和InstanceNormalization的支持 🍄
-
#24552 OpenVINO, OpenCL和CUDA后端LayerNormalization的支持 🍄
Core模块:
- #23965 增加cv::broadcast 🍄
Objdetect模块:
-
#24364 修复QR码编码器版本估计的bug
-
#24355 使用动态窗口的更准确的ArUco标记角点细化
-
#24479 ArUco中过滤轮廓的bug修复
-
#24598 Android的QR码检测示例
-
ArUco标记, Charuco板及QR码的bug修复和文档更新
Video:
- #24201 LIU Pengyu贡献了基于vision transformer的VitTrack模型的目标跟踪API TrackerVit 🍄
Calibration模块:
-
棋盘格标定中的多个修复和改进
-
#23025 修复标定中stdDev的计算问题
-
#24482 修复findEssentialMat使用USAC时的bug
-
#24527 修复cv::cornerSubPix中超出图像的访问
-
#23607 Fixed ap3p中的崩溃
-
#24035 修复stereoRectify图像边界
-
#24211 修复essential_solver.cpp中的"use after free"问题
Python Bindings:
-
对丢失的类型和手动封装的类型添加了类型存根生成
-
#24026 Numpy数组添加只读标志处理
-
#24028 修复了模块内的异常处理和绑定
-
#23958 改进了Numpy数组类型处理中的错误消息
-
#24468 修复了 Python 中的构造函数文档
Android:
-
在Maven Central发布新的Android Archive Package (AAR)
-
新的Android示例: QR码检测,视频IO;更新DNN和Face Detector示例
-
改用Gradle 7.6.3
平台支持:
- #23021 CMake中增加CUDA作为第一语言的支持,目前使用的是已经弃用的(自 CMake 3.10 起)FindCUDA 模块。
其他:
- HAN Liutong实现OpenCV的CPU优化代码兼容可变向量长度的SIMD (RISC-V RVV) 🍄
OpenCV Model Zoo:
自OpenCV 4.9.0起,OpenCV Model Zoo (https://github.com/opencv/opencv_zoo) 将与opencv同步发布。
OpenCV 4.9 下载地址:
-
Documentation
-
Sources
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1157174922a44cf198beb7468cfed4da.png#pic_center)
OpenCV中国团队是OpenCV在中国的开发团队,非营利目的,致力于OpenCV的开发、维护和推广工作。
**本书京东优惠购书链接:https://item.jd.com/14098452.html**
1.1 图像的读取与保存
1.1.1 图像的读取
函数cv.imread用于从指定文件加载图像并返回该图像的矩阵。
函数原型
cv.imread(filename[, flags=IMREAD_COLOR]) → retval
参数说明
- filename:读取图像的文件路径和文件名,包括文件扩展名。
- flags:读取方式的参数,可选项如下。
- IMREAD_COLOR:始终将图像转换为三通道BGR格式的彩色图像,是默认方式。
- IMREAD_GRAYSCALE:始终将图像转换为单通道灰度图像。
- IMREAD_UNCHANGED:按原样返回加载的图像(使用Alpha通道)。
- IMREAD_ANYDEPTH:输入具有相应深度时会返回16位或32位图像,否则会转换为8位图像。
- IMREAD_ANYCOLOR:以任何可能的颜色格式读取图像。
- retval:返回值,读取的OpenCV图像为多维Numpy数组。
注意问题
(1) 在OpenCV中,最常用的图像数据结构是C++语言定义的Mat类。在Python语言中,Mat类的对象创建和操作是通过Numpy数组实现的。OpenCV对图像的任何操作,本质上都是对 Numpy数组的运算。
(2) OpenCV读取图像文件,返回值是二维或三维Numpy数组。当读取灰度图像时,返回值是形为(h,w)的二维数组;当读取彩色图像时,返回值是形为(h,w,ch)的三维数组。
(3) 如果无法读取图像(如文件不存在、权限不正确、格式不被支持或无效),并不会有报错提示,而会返回一个空矩阵。
(4) 该函数不支持带有中文或空格的文件路径和文件名,但也不会出现报错提示。当必须使用中文路径或文件名时,可以使用函数cv.imdecode 处理,具体参见【例程0103】。
(5) 在OpenCV中,使用的彩色图像为BGR格式的图像,读取图像文件后,图像文件可按B/G/R的顺序存储为多维数组。PIL、PyQt、Matplotlib 等库使用的是RGB格式的图像,图像文件按R/G/B的顺序存储。
(6) 该函数默认忽略图像的透明通道(Alpha通道),通过设置参数flags=IMAGE_
UNCHANGED可以读取透明通道。
(7) 对于彩色图像文件,该函数默认按彩色图像格式读取,也可以通过设置flags=0读取为灰度图像格式。将彩色图像格式读取为灰度图像格式,本质上是读取的彩色图像,并将彩色图像转换为灰度图像。
(8) 目前支持的文件及扩展名如下。
◎ Windows 位图:.bmp、.dib。
◎ JPEG 文件:.jpeg、.jpg、.jpe。
◎ JPEG 2000文件:.jp2。
◎ 便携式网络图形:.png。
◎ WebP:.webp。
◎ 便携式图像:.pbm、.pgm、.ppm、.pxm、.pnm。
◎ TIFF 文件:.tiff、.tif。
1.1.2 图像的保存
函数cv.imwrite可以基于扩展名的格式将图像保存到指定文件。
函数原型
cv.imwrite(filename, img[,params]) → retval
参数说明
- filename:保存图像的文件路径和文件名,包括文件扩展名。
- img:要保存的 OpenCV 图像,格式为多维Numpy数组。
- params:编码格式参数,可选项如下。
- IMWRITE_JPEG_QUALITY:设置JPEG/JPG格式图片的质量。数值越大,图片质量越高,取值范围为0~100,默认值为95。
- IMWRITE_PNG_COMPRESSION:设置PNG 格式图片的压缩比。数值越大,压缩比越大,取值范围为0~9,默认值为3。
- IMWRITE_TIFF_RESUNIT:设置TIF 格式图片的分辨率。
- IMWRITE_WEBP_QUALITY:设置WEBP 格式图片的质量。数值越大,图片质量越高,取值范围为1~100,默认值为100。
- IMWRITE_JPEG2000_COMPRESSION_X1000:设置JPEG2000格式图片的质量,默认值为1000。
- retval:返回值,是布尔值,保存成功标志。
注意问题
(1) 图像通常保存为8位单通道图像或BGR三通道彩色图像,而BGRA四通道图像可以使用Alpha通道保存为PNG图像,更多设置详见OpenCV说明文档(链接1-1)。
(2) 函数cv.imwrite将OpenCV图像(多维Numpy数组)保存为图像文件,图像的保存格式由filename的扩展名决定,与读取图像文件时的图像格式无关。
(3) 函数cv.imwrite不支持带有中文或空格的文件路径和文件名,但也不会有报错提示。需要使用中文路径或文件名时,可以使用函数cv.imdecode 处理,参见【例程0103】。
【例程0101】用OpenCV读取和保存图像文件
本例程用OpenCV读取和保存图像文件,注意读取图像文件时的参数设置。
# 【0101】用OpenCV 读取和保存图像文件
import cv2 as cv
if __name__ == '__main__':
# 读取图像文件,支持 BMP、JPG、PNG、TIFF 等常用格式
filepath = "../images/Lena.tif" # 读取图像文件的路径
img = cv.imread(filepath, flags=1) # flags=1 读取彩色图像文件(BGR)
gray = cv.imread(filepath, flags=0) # flags=0 读取为灰度图像
saveFile = "../images/imgSave1.png" # 保存图像文件的路径
cv.imwrite(saveFile, img, [int(cv.IMWRITE_PNG_COMPRESSION), 8])
cv.imwrite("../images/imgSave2.png", gray)
程序说明
(1) 本例程读取的图像文件是彩色图像文件。读取为彩色图像时可以设置flags=1,也可以省略;读取为灰度图像时必须设置flags=0。
(2) 读取和保存图像文件可以使用相对路径或绝对路径。
(3) 读取文件时要注意检查指定路径的图像文件是否存在。
【例程0102】从网络地址读取图像文件
本例程使用函数cv.imdecode从指定的内存缓存中读取数据,并将数据转换为图像格式,用于从网络传输数据中恢复图像。
# 【0102】从网络地址读取图像文件
import cv2 as cv
import numpy as np
if __name__ == '__main__':
import urllib.request as request
response = request.urlopen\
("https://profile.csdnimg.cn/8/E/F/0_youcans") # 指定的 url 地址
imgUrl = cv.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1)
cv.imshow("imgUrl", imgUrl) # 在窗口显示图像
key = cv.waitKey(5000) # 5000 毫秒后自动关闭
cv.destroyAllWindows()
程序说明
(1) 从网络地址读取图像文件不能使用函数cv.imread,而要使用函数cv.imdecode。
(2) 函数cv.imdecode能将图像编码为流数据,赋值到内存缓存中,以方便网络传输。
【例程0103】读取和保存文件路径中带有中文字符的图像
本例程用于读取/保存文件路径中带有中文字符的图像。
# 【0103】读取和保存文件路径中带有中文字符的图像
import cv2 as cv
import numpy as np
if __name__ == '__main__':
filepath = "../images/测试图01.tif" # 带有中文的文件路径和文件名
# img1 = cv.imread(filepath, flags=1) # 中文路径读取失败,但不会报错
img2 = cv.imdecode(np.fromfile(filepath, dtype=np.uint8), flags=-1)
saveFile = "../images/测试图02.tif" # 带有中文的保存文件路径
# cv.imwrite(saveFile, img2) # 中文路径保存失败,但不会报错
cv.imencode(".jpg", img2)[1].tofile(saveFile)
程序说明
如果读取/保存图像的路径和文件名中含有中文字符,则不能用函数cv.imread/cv.imwrite操作,可以使用函数cv.imdecode/cv.imencode处理。