Python机器视觉第二阶段:OpenCV核心操作详解(从基础到实战)

Python机器视觉第二阶段:OpenCV核心操作详解(从基础到实战) Python机器视觉第二阶段OpenCV核心操作详解在上一篇文章中我们完成了Python基础、NumPy数组和Matplotlib显示的学习打下了坚实的基础。从本篇开始我们将正式进入OpenCV的世界学习如何用OpenCV进行图像和视频处理包括摄像头调用、颜色空间转换、鼠标交互等。这些知识是后续进行缺陷检测、目标跟踪等项目的基础。本文所有代码都可以直接复制运行注释非常详细。如果你还没有安装OpenCV请先执行pip install opencv-python参考我前面的文章。一、OpenCV简介OpenCVOpen Source Computer Vision Library是一个开源的计算机视觉库支持C、Python等多种语言。它提供了数千种图像处理和计算机视觉算法是机器视觉领域的必备工具。OpenCV-Python是OpenCV的Python接口它将OpenCV的核心功能封装成Python模块让我们可以用Python轻松调用。OpenCV读取的图像数据直接以NumPy数组形式存在因此可以和NumPy无缝配合。二、OpenCV基础操作1. 读取、显示和保存图像1.1 读取图像cv2.imread()importcv2# 读取图像返回NumPy数组通道顺序为BGRimgcv2.imread(example.jpg)# 图片放在当前目录下# 检查是否读取成功ifimgisNone:print(图片读取失败请检查路径)exit()参数说明第二个参数可以指定读取方式cv2.IMREAD_COLOR彩色模式默认忽略透明度cv2.IMREAD_GRAYSCALE灰度模式cv2.IMREAD_UNCHANGED包括alpha通道示例img_graycv2.imread(example.jpg,cv2.IMREAD_GRAYSCALE)1.2 显示图像cv2.imshow()cv2.imshow(窗口标题,img)# 创建窗口显示图像cv2.waitKey(0)# 等待按键0表示无限等待cv2.destroyAllWindows()# 关闭所有窗口cv2.waitKey()返回按键的ASCII码常用于控制程序流程。如果指定时间如cv2.waitKey(1000)则等待1000毫秒后自动关闭。1.3 保存图像cv2.imwrite()cv2.imwrite(output.jpg,img)# 保存为output.jpg完整示例读取、显示灰度图并保存importcv2 imgcv2.imread(example.jpg,cv2.IMREAD_GRAYSCALE)cv2.imshow(灰度图,img)cv2.waitKey(0)cv2.imwrite(gray_example.jpg,img)cv2.destroyAllWindows()2. 获取图像属性importcv2 imgcv2.imread(example.jpg)h,w,cimg.shape# 高度、宽度、通道数print(f高:{h}, 宽:{w}, 通道:{c})# 如果图像是灰度图shape只有两个值需要单独处理iflen(img.shape)2:h,wimg.shape c1else:h,w,cimg.shapeprint(像素总数:,img.size)# 所有像素个数print(数据类型:,img.dtype)# 通常是uint83. 像素访问与修改因为图像是NumPy数组我们可以通过索引直接访问或修改像素值。importcv2 imgcv2.imread(example.jpg)# 访问 (y100, x200) 处的像素BGR值pximg[100,200]print(px)# [B G R]# 只访问蓝色通道值blueimg[100,200,0]print(blue)# 修改像素值img[100,200][0,0,255]# 设置为红色# 修改一整块区域ROIimg[50:150,50:150][255,255,255]# 画一个白色方块注意直接修改大区域可能会比较慢但对我们学习足够了。4. 图像ROI感兴趣区域ROI是图像处理中非常常用的概念可以通过切片实现。# 提取脸部区域假设坐标已知faceimg[100:300,200:400]# 行范围y列范围x# 将脸部区域复制到另一个位置img[50:250,400:600]face# 注意尺寸要一致5. 颜色空间转换OpenCV默认使用BGR颜色空间但我们经常需要转换成其他空间比如HSV用于颜色识别RGB用于Matplotlib显示。常用转换cv2.COLOR_BGR2GRAYBGR转灰度cv2.COLOR_BGR2RGBBGR转RGBcv2.COLOR_BGR2HSVBGR转HSVimportcv2 imgcv2.imread(example.jpg)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)cv2.imshow(灰度图,gray)cv2.imshow(HSV图,hsv)cv2.waitKey(0)cv2.destroyAllWindows()6. 绘图功能OpenCV可以在图像上绘制各种几何图形和文字。importcv2importnumpyasnp# 创建一张黑色画布canvasnp.zeros((480,640,3),dtypenp.uint8)# 画一条线起点(10,10)终点(200,10)颜色绿色线宽2cv2.line(canvas,(10,10),(200,10),(0,255,0),2)# 画矩形左上角(50,50)右下角(150,150)颜色红色线宽2-1表示填充cv2.rectangle(canvas,(50,50),(150,150),(0,0,255),2)# 画圆圆心(300,100)半径50颜色蓝色线宽2cv2.circle(canvas,(300,100),50,(255,0,0),2)# 画椭圆cv2.ellipse(canvas,(400,200),(100,50),0,0,360,(255,255,0),2)# 添加文字fontcv2.FONT_HERSHEY_SIMPLEX cv2.putText(canvas,OpenCV,(100,300),font,2,(255,255,255),2)cv2.imshow(Drawings,canvas)cv2.waitKey(0)cv2.destroyAllWindows()7. 鼠标事件OpenCV可以捕捉鼠标操作实现交互。importcv2# 鼠标回调函数defmouse_callback(event,x,y,flags,param):ifeventcv2.EVENT_LBUTTONDOWN:print(f左键按下: ({x},{y}))elifeventcv2.EVENT_RBUTTONDOWN:print(f右键按下: ({x},{y}))elifeventcv2.EVENT_MOUSEMOVE:ifflagscv2.EVENT_FLAG_LBUTTON:# 左键拖动print(f拖动中: ({x},{y}))imgcv2.imread(example.jpg)cv2.namedWindow(image)cv2.setMouseCallback(image,mouse_callback)whileTrue:cv2.imshow(image,img)keycv2.waitKey(1)0xFFifkeyord(q):# 按q退出breakcv2.destroyAllWindows()8. 视频读写与摄像头调用8.1 从摄像头读取视频importcv2# 打开摄像头参数0表示第一个摄像头capcv2.VideoCapture(0)ifnotcap.isOpened():print(无法打开摄像头)exit()whileTrue:ret,framecap.read()# 读取一帧ret为是否成功ifnotret:breakcv2.imshow(Camera,frame)ifcv2.waitKey(1)0xFFord(q):# 按q退出breakcap.release()# 释放摄像头cv2.destroyAllWindows()8.2 保存视频importcv2 capcv2.VideoCapture(0)# 定义编码器并创建VideoWriter对象fourcccv2.VideoWriter_fourcc(*XVID)outcv2.VideoWriter(output.avi,fourcc,20.0,(640,480))whileTrue:ret,framecap.read()ifnotret:breakout.write(frame)# 写入帧cv2.imshow(frame,frame)ifcv2.waitKey(1)0xFFord(q):breakcap.release()out.release()cv2.destroyAllWindows()8.3 读取视频文件capcv2.VideoCapture(video.mp4)whilecap.isOpened():ret,framecap.read()ifnotret:breakcv2.imshow(Video,frame)ifcv2.waitKey(25)0xFFord(q):# 25毫秒延迟控制播放速度breakcap.release()cv2.destroyAllWindows()9. 滑动条Trackbar滑动条可以用来动态调整参数。importcv2importnumpyasnpdefnothing(x):pass# 创建黑色画布和窗口imgnp.zeros((300,512,3),np.uint8)cv2.namedWindow(image)# 创建三个滑动条分别对应BGRcv2.createTrackbar(B,image,0,255,nothing)cv2.createTrackbar(G,image,0,255,nothing)cv2.createTrackbar(R,image,0,255,nothing)whileTrue:# 获取当前滑动条的值bcv2.getTrackbarPos(B,image)gcv2.getTrackbarPos(G,image)rcv2.getTrackbarPos(R,image)# 设置画布颜色img[:][b,g,r]cv2.imshow(image,img)ifcv2.waitKey(1)0xFFord(q):breakcv2.destroyAllWindows()三、实战案例案例1摄像头实时捕获视频在画面上叠加可拖拽的矩形框这个案例综合运用了鼠标事件和摄像头操作实现一个可交互的矩形框。importcv2# 全局变量drawingFalse# 是否正在画矩形ix,iy-1,-1# 矩形起始点rect(0,0,0,0)# (x, y, w, h)# 鼠标回调函数defdraw_rectangle(event,x,y,flags,param):globalix,iy,drawing,rectifeventcv2.EVENT_LBUTTONDOWN:drawingTrueix,iyx,y rect(x,y,0,0)# 初始化矩形elifeventcv2.EVENT_MOUSEMOVE:ifdrawing:# 更新矩形的宽高rect(ix,iy,x-ix,y-iy)elifeventcv2.EVENT_LBUTTONUP:drawingFalserect(ix,iy,x-ix,y-iy)# 打开摄像头capcv2.VideoCapture(0)cv2.namedWindow(frame)cv2.setMouseCallback(frame,draw_rectangle)whileTrue:ret,framecap.read()ifnotret:break# 如果矩形有大小则在画面上绘制矩形ifrect[2]!0andrect[3]!0:x,y,w,hrect cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),2)cv2.imshow(frame,frame)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()案例2颜色提取将图片从BGR转为HSV并提取指定颜色范围的物体这个案例演示了颜色空间转换和阈值分割是颜色识别的基础。importcv2importnumpyasnp capcv2.VideoCapture(0)# 定义蓝色范围的HSV阈值可以根据需要调整lower_bluenp.array([100,50,50])upper_bluenp.array([130,255,255])whileTrue:ret,framecap.read()ifnotret:break# 转换为HSVhsvcv2.cvtColor(frame,cv2.COLOR_BGR2HSV)# 生成掩膜在蓝色范围内的像素为白色其余黑色maskcv2.inRange(hsv,lower_blue,upper_blue)# 对原图应用掩膜得到蓝色区域resultcv2.bitwise_and(frame,frame,maskmask)cv2.imshow(Original,frame)cv2.imshow(Mask,mask)cv2.imshow(Result,result)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()知识点HSV颜色空间更适合颜色分割因为色调Hue受光照影响较小。cv2.inRange()生成二值掩膜。cv2.bitwise_and()将掩膜与原图结合。案例3实现一个简单的电子画板用鼠标在画布上自由绘画按c清空按s保存。importcv2importnumpyasnp# 创建白色画布canvasnp.ones((480,640,3),dtypenp.uint8)*255drawingFalselast_x,last_y-1,-1defpaint(event,x,y,flags,param):globaldrawing,last_x,last_y,canvasifeventcv2.EVENT_LBUTTONDOWN:drawingTruelast_x,last_yx,yelifeventcv2.EVENT_MOUSEMOVEanddrawing:# 画线连接上一个点和当前点cv2.line(canvas,(last_x,last_y),(x,y),(0,0,255),2)last_x,last_yx,yelifeventcv2.EVENT_LBUTTONUP:drawingFalsecv2.namedWindow(Paint)cv2.setMouseCallback(Paint,paint)whileTrue:cv2.imshow(Paint,canvas)keycv2.waitKey(1)0xFFifkeyord(c):# 按c清空画布canvas[:]255elifkeyord(s):# 按s保存图片cv2.imwrite(drawing.png,canvas)print(保存成功)elifkeyord(q):# 按q退出breakcv2.destroyAllWindows()四、总结与下一步通过本阶段的学习你应该已经掌握了OpenCV的基本图像读写和属性获取像素访问与ROI操作颜色空间转换绘图功能鼠标事件和滑动条摄像头调用和视频处理三个综合实战案例 第二阶段参考文档链接OpenCV-Python官方教程 —— OpenCV官方Python教程涵盖图像读写、视频处理、绘图、鼠标事件、颜色空间转换等所有核心操作是学习OpenCV的第一手资料。NumPy快速入门 —— NumPy官方文档详细讲解数组创建、索引、切片、运算等因为OpenCV图像本质就是NumPy数组必须掌握。Matplotlib教程 —— Matplotlib官方教程学习如何显示图像、绘制子图、保存图像等用于可视化结果。菜鸟教程 Python 基础 —— 最适合新手的中文Python入门教程包含基础语法、函数、列表推导式等可随时查阅。廖雪峰的Python教程 —— 国内公认的Python经典教程从基础到实战讲解清晰适合系统学习。以上文档均为免费公开资源建议在学习过程中结合本文案例反复查阅加深理解。下一步我们将进入图像处理核心算法包括滤波、边缘检测、阈值分割、形态学操作等这些都是缺陷检测项目中必不可少的基础。如果你在学习过程中有任何问题欢迎在评论区留言。记得多动手练习把代码自己敲一遍才能真正掌握