1. 从零搭建OpenCV-Python开发环境第一次接触数字图像处理的朋友们恭喜你们选对了工具链OpenCV作为计算机视觉领域的瑞士军刀配合Python的简洁语法能让你快速实现各种酷炫的图像处理效果。不过在写代码之前我们需要先搞定开发环境。我推荐使用Anaconda来管理Python环境它能完美解决依赖包冲突的问题。安装完成后打开Anaconda PromptWindows或终端Mac/Linux依次执行以下命令conda create -n opencv_env python3.8 # 创建独立环境 conda activate opencv_env # 激活环境 pip install opencv-python # 安装OpenCV核心库 pip install opencv-contrib-python # 安装扩展模块 pip install matplotlib numpy # 安装配套科学计算库验证安装是否成功可以运行这个简单的测试脚本import cv2 print(OpenCV版本:, cv2.__version__) img cv2.imread(test.jpg) # 准备一张测试图片 if img is not None: print(图像加载成功)注意如果遇到无法加载动态链接库的错误通常是缺少Visual C运行库导致的去微软官网下载安装最新的VC_redist即可解决。2. 图像文件的基础操作2.1 图像的读取与属性解析用OpenCV读取图像就像用Python打开普通文件一样简单import cv2 # 读取图像第二个参数可选 img cv2.imread(lena.jpg, cv2.IMREAD_COLOR) # 彩色模式 gray_img cv2.imread(lena.jpg, cv2.IMREAD_GRAYSCALE) # 灰度模式 original_img cv2.imread(lena.jpg, cv2.IMREAD_UNCHANGED) # 包含alpha通道 # 获取图像属性 print(图像尺寸高, 宽, 通道数:, img.shape) print(像素总数:, img.size) print(数据类型:, img.dtype) # 通常是uint8这里有个新手容易踩的坑OpenCV默认使用BGR色彩空间而非常见的RGB。如果直接用matplotlib显示OpenCV读取的图像会出现颜色异常需要先转换rgb_img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)2.2 图像的显示与保存显示图像有两种主流方式。OpenCV自带的imshow适合快速调试cv2.imshow(Demo Window, img) cv2.waitKey(0) # 0表示无限等待按键 cv2.destroyAllWindows()而Matplotlib更适合生成报告时使用import matplotlib.pyplot as plt plt.imshow(rgb_img) plt.axis(off) # 隐藏坐标轴 plt.show()保存图像只需一行代码OpenCV会根据文件后缀自动选择编码格式cv2.imwrite(output.jpg, img, [int(cv2.IMWRITE_JPEG_QUALITY), 95]) # 质量参数实测发现同一张图片保存为不同格式时文件大小差异明显。例如512x512的lena图像BMP格式786KBPNG格式499KBJPG质量9053KBJPG质量5012KB3. 视频处理的核心技巧3.1 视频文件的读写处理视频本质上是连续处理图像帧。OpenCV提供了VideoCapture和VideoWriter两个核心类# 读取视频文件 cap cv2.VideoCapture(input.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break # 在此处添加帧处理代码 cv2.imshow(Frame, frame) if cv2.waitKey(25) 0xFF ord(q): break cap.release() # 保存处理后的视频 fourcc cv2.VideoWriter_fourcc(*XVID) out cv2.VideoWriter(output.avi, fourcc, 30.0, (640, 480)) for i in range(100): frame np.random.randint(0, 256, (480,640,3), dtypenp.uint8) out.write(frame) out.release()3.2 摄像头实时处理调用摄像头只需将VideoCapture的参数改为设备索引通常0是内置摄像头cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) while True: ret, frame cap.read() gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow(Live, gray) if cv2.waitKey(1) 27: # ESC键退出 break4. 图像处理的核心操作4.1 通道拆分与合并彩色图像由BGR三个通道组成拆分后可以单独处理b, g, r cv2.split(img) # 方法1 b img[:,:,0] # 方法2仅获取蓝色通道 # 合并通道时注意顺序 merged cv2.merge([b, g, r]) fake_ir cv2.merge([r, g, r]) # 模拟红外效果4.2 图像ROI操作ROIRegion of Interest操作就像图像剪裁face img[100:300, 200:400] # y范围, x范围 img[50:250, 50:250] face # 复制人脸区域4.3 像素级操作直接访问和修改像素值# 获取(100,200)处的BGR值 px img[100, 200] print(BGR值:, px) # 修改区域颜色 img[100:150, 200:250] [255, 0, 0] # 蓝色矩形 # 更高效的方式 img.itemset((100,200,0), 255) # 设置B通道值4.4 图像几何变换# 缩放 resized cv2.resize(img, None, fx0.5, fy0.5, interpolationcv2.INTER_AREA) # 旋转 M cv2.getRotationMatrix2D((img.shape[1]/2, img.shape[0]/2), 45, 1) rotated cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) # 仿射变换 pts1 np.float32([[50,50],[200,50],[50,200]]) pts2 np.float32([[10,100],[200,50],[100,250]]) M cv2.getAffineTransform(pts1, pts2) warped cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))4.5 色彩空间转换除了RGB/BGRHSV色彩空间在颜色识别中非常有用hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义蓝色范围 lower_blue np.array([100,50,50]) upper_blue np.array([130,255,255]) # 创建掩膜 mask cv2.inRange(hsv, lower_blue, upper_blue) # 应用掩膜 blue_only cv2.bitwise_and(img, img, maskmask)在实际项目中我发现OpenCV的默认参数可能不适合所有场景。比如处理低光照图像时可以适当调整gamma值def adjust_gamma(image, gamma1.0): invGamma 1.0 / gamma table np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype(uint8) return cv2.LUT(image, table)图像处理最有趣的地方在于同样的操作组合可以产生完全不同的效果。比如先边缘检测再颜色反转就能得到素描风格的效果gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred cv2.GaussianBlur(gray, (7,7), 0) edges cv2.Laplacian(blurred, cv2.CV_8U, ksize5) ret, sketch cv2.threshold(edges, 50, 255, cv2.THRESH_BINARY_INV)