Python OpenCV实现摄像头调用与颜色识别
本文介绍如何在Ubuntu环境下使用Python和OpenCV库调用摄像头,并实现基础的视频流显示、蓝色背景检测以及复杂的多颜色识别算法。通过具体代码示例,展示从环境配置到实际应用的完整流程,帮助开发者快速掌握机器视觉基础。
Python OpenCV环境配置与摄像头调用
近期因专注于个人项目,更新有所延迟。在近期的开发工作中,发现Python的应用场景极为广泛且操作便捷,因此决定投入时间学习。在此分享今日的学习心得与实践成果。
本教程的运行环境为Ubuntu 14.0.4。
首先进行Python环境的安装,本文使用的是Python 2.7版本。安装过程十分简单,仅需一条指令即可完成。
sudo apt-get install python-dev
通常情况下,系统预装时已包含Python,此步骤可省略。接下来安装python-opencv库,后续将依赖该库进行图像处理和摄像头调用。这也是Linux系统高效便捷的一个体现。
sudo apt-get install python-opencv
环境准备就绪后,开始编写代码。首先实现打开摄像头并显示画面的功能。使用vim编辑器创建pythonpractice.py文件,粘贴以下代码。请注意,Python对缩进有严格要求,下文代码均使用四个空格进行缩进,请确保复制时格式正确。
lmport cv2
import numpy as np#添加模块和矩阵模块
cap=cv2.VideoCapture(0)
#打开摄像头,若打开本地视频,同opencv一样,只需将0换成("×××.avi")
while(1): # get a frame
ret, frame = cap.read() # show a frame
cv2.imshow("capture", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#释放并销毁窗口
保存文件并退出编辑器。
在终端执行命令:python pythonpractice.py
基于HSV空间的蓝色背景检测
此时屏幕上应显示摄像头捕捉到的画面。接下来,我们将增加几行代码,实现蓝色背景的检测功能。以一瓶蓝色脉动饮料为例进行实验。
import cv2
import numpy as np
cap = cv2.VideoCapture(0)# set blue thresh
lower_blue=np.array([78,43,46])
upper_blue=np.array([110,255,255])
while(1): # get a frame and show
ret, frame = cap.read()
cv2.imshow('Capture', frame) # change to hsv model
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # get mask
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask) # detect blue
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('Result', res)
if cv2.waitKey(1) & 0xFF == ord('q'):
breakcap.release()
cv2.destroyAllWindows()
再次运行python pythonpractice.py,可以将手机屏幕或其他物体作为蓝色背景进行测试。代码逻辑较为简单,建议读者自行理解其原理。
复杂多颜色识别与轮廓提取
下面提供一个更为复杂的颜色识别代码示例。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time
readlower=np.array([156,179,144])
readupper=np.array([180,255,255])
readlower1 = np.array([0, 128, 146])
readupper2 = np.array([5, 255, 255])
lowerarry=[[readlower,readupper,'red'],[readlower1,readupper2,'red1']]
capture=cv2.VideoCapture('4.mp4')
while True:
ret,frame=capture.read()
print frame.shape
frame=cv2.resize(frame,(640,480))
if ret==False:
print("video is erro")
#cv2.imshow('xiaorun',frame)
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
for colormin,colermax,name in lowerarry:
mask=cv2.inRange(hsv,colormin,colermax)
#res = cv2.bitwise_and(frame, frame, mask=mask)
#mask=cv2.erode(mask,None,iterations=1)
mask=cv2.dilate(mask,None,iterations=25)
ret, binary = cv2.threshold(mask,15, 255, cv2.THRESH_BINARY)
cv2.imshow('result',binary)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closed', closed)
#erode = cv2.erode(closed, None, iterations=4)
#cv2.imshow('erode', erode)
dilate = cv2.dilate(closed, None, iterations=50)
cv2.imshow('dilate', dilate)
_,contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#res=_.copy()
for con in contours:
x, y, w, h = cv2.boundingRect(con) # 将轮廓分解为识别对象的左上角坐标和宽、高
# 在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0,0), 3)
cv2.imshow('res',frame)
key=cv2.waitKey(1)
if key==ord('q'):
break
旨在强调学以致用,编程语言的学习不应仅停留在语法层面,通过实际项目动手实践才是掌握的关键。祝各位在机器视觉领域玩得开心。
以上是利用Python调用摄像头及进行颜色检测的完整内容,希望能对读者有所帮助,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













