OpenCV-Python 是计算机视觉领域最流行的开源库之一,它结合了 OpenCV (Open Source Computer Vision Library) 的 C++ 高性能实现和 Python 的简洁易用特性,为开发者提供了强大的图像和视频处理能力。具有以下优势:
典型应用领域:
-
图像/视频处理与分析
-
物体检测与识别
-
人脸识别与生物特征识别
-
增强现实(AR)
-
自动驾驶视觉系统
-
医学影像分析
-
工业质检
丰富的算法库:
- 图像处理:滤波、几何变换、色彩空间转换
- 特征提取:SIFT、SURF、ORB 等
- 机器学习:SVM、KNN、决策树等
- 深度学习:支持 TensorFlow、PyTorch 模型
丰富的算法库,比如:
-
人脸识别系统:
-
使用 Haar 级联或 DNN 进行人脸检测
-
LBPH 或 FaceNet 进行识别
-
-
车牌识别:
-
边缘检测定位车牌
-
OCR 识别字符
-
-
实时滤镜应用:
-
美颜滤镜
-
风格化转换
-
-
运动追踪:
-
光流法追踪
-
背景减除
-
一、 Gui Features in OpenCV
1.1加载图片
cv2.imread()
是 OpenCV 中用于从文件加载图像的核心函数,它将图像文件读取为 NumPy 数组,便于后续处理和分析。所以,在opencv-python中,图片的实际上是一个np数组。
image = cv2.imread(filename, flags=cv2.IMREAD_COLOR)
参数说明filename (字符串):图像文件的路径(支持格式:JPEG、PNG、BMP、TIFF等)flags (可选):读取模式标志,常用有以下几种:cv2.IMREAD_COLOR (默认):加载3通道BGR彩色图像(忽略透明度)cv2.IMREAD_GRAYSCALE:加载为单通道灰度图像cv2.IMREAD_UNCHANGED:按原样加载,包括alpha通道(4通道BGRA)cv2.IMREAD_ANYDEPTH:保留原始位深度cv2.IMREAD_REDUCED_COLOR_2/4/8:按比例缩小尺寸加载
返回值成功时返回 numpy.ndarray 多维数组失败时返回 None(文件不存在/格式不支持等)
demo
从路径中加载一张图片,并且从窗口中打开,最后保存到其他地方
import cv2
import sysimg = cv2.imread('/media/lee/软件/colmap_exp/instant/result/zj/images/VID_20250325_150846/0.0.png')print(type(img),img)if img is None:sys.exit("Error: Could not read the image.")cv2.imshow("display window",img)cv2.waitKey(0)
# cv2.waitKey(0) 中的 0 表示无限等待,即程序会一直暂停,直到用户按下任意键。
# 如果传入一个正整数(例如 cv2.waitKey(1000)),则表示等待指定的毫秒数(1000 毫秒 = 1 秒),之后程序会继续执行,无论用户是否按下键。cv2.destroyWindow("display window")cv2.imwrite('open-cv/read_image_output.png', img)
exit()
放大以后,可以看到各个像素的RGB数值:
print图片:
1.2加载视频
cv2.VideoCapture()
是 OpenCV(开源计算机视觉库)中用于从 摄像头、视频文件 或 网络流 捕获视频的函数。它是视频处理和计算机视觉应用的基础工具。
cv2.VideoCapture(source, [apiPreference])source(输入源):摄像头:0(默认摄像头)、1(第二个摄像头)等。视频文件:文件路径(如 "video.mp4")。网络/IP 摄像头:RTSP/HTTP 流地址(如 "rtsp://192.168.1.1/live")。apiPreference(可选):指定视频捕获的后端(如 cv2.CAP_DSHOW 用于 Windows 摄像头)。
demo1:加载本地视频,转为灰度图
import numpy as np
import cv2 as cvcap = cv.VideoCapture('/media/lee/软件/colmap_exp/instant/result/zj/video/VID_20250325_151144.mp4')while cap.isOpened():ret,frame = cap.read()# if frame is read correctly ret is Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)cv.imshow('frame',gray)if cv.waitKey(1) == ord('q'):breakcap.release()#Closes video file or capturing device.
cv.destroyAllWindows()#Closes all OpenCV windows.
demo2:摄像头录像,保存
import cv2cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 输出文件while cap.isOpened():ret, frame = cap.read()if not ret:breakout.write(frame) # 写入帧cv2.imshow("录制中...", frame)if cv2.waitKey(1) == ord('q'):breakcap.release()
out.release() # 释放写入器
cv2.destroyAllWindows()
1.3draw different geometric shapes
包括多种形状
demo:使用直线,矩形,圆,椭圆,折线在纯黑图片上画出形状
import numpy as np
import cv2 as cv# create a black image
img = np.zeros((512,512,3),np.int8)
# cv.imwrite('open-cv/gui_features/draw_image.png',img)# draw a diagonal blue line with thickness of 5 px
cv.line(img,(0,0),(511,511),(255,0,0),5)
# cv2.line(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)cv.rectangle(img,(394,0),(300,129),(0,255,0),3)
# cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)cv.circle(img,(347,363),(80),(0,0,255),-1)
# cv2.circle(img, center, radius, color, thickness=1, lineType=cv2.LINE_8, shift=0)cv.ellipse(img,(256,256),(100,50),0,0,360,(255,0,0),-1)
# cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=1, lineType=cv2.LINE_8, shift=0)pts = np.array([[10,5],[20,30],[70,20],[50,10]],np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
# cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
# isClosed:布尔值,指示多边形是否闭合cv.imshow("Line", img)
cv.waitKey(0)
cv.destroyAllWindows()