python 实时调取摄像头的示例代码


Posted in Python onNovember 25, 2020

调取摄像头的实现

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
#参数为0时调用本地摄像头;url连接调取网络摄像头;文件地址获取本地视频
while(True):
ret,frame=cap.read()

#灰度化
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)

#普通图片
cv2.imshow('frame',frame)

if cv2.waitKey(1)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()

opencv代码

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

#设置工作路径
import os
os.chdir('E:\\0yfl\\SH-spyder-workspace\\')
os.path.abspath('.')


import numpy as np
import cv2

#1.1读取图片imread;展示图片imshow;导出图片imwrite
#只是灰度图片
img=cv2.imread('Myhero.jpg',cv2.IMREAD_GRAYSCALE)
#彩色图片
img=cv2.imread('Myhero.jpg',cv2.IMREAD_COLOR)
#彩色以及带有透明度
img=cv2.imread('Myhero.jpg',cv2.IMREAD_UNCHANGED)
print(img)
#设置窗口可自动调节大小
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
k=cv2.waitKey(0)
#如果输入esc
if k==27:
  #exit
  cv2.destroyAllWindows
#如果输入s
elif k==ord('s'):
  #save picture and exit
  cv2.imwrite('Myhero_out.png',img)
  cv2.destroyAllWindows()


#1.2视频读取
#打开内置摄像头
cap=cv2.VideoCapture(0)
#打开视频
cap=cv2.VideoCapture('why.mp4')
#或者视频每秒多少帧的数据
fps=cap.get(5)
i=0
while(True):
  #读取一帧
  ret,frame=cap.read()
  #转化为灰图
  gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  #设置导出文件名编号
  i = i + 1
  #每1s导出一张
  if i/fps==int(i/fps):
    #导出文件名为why+编号+.png
    #若想要导出灰图,则将下面frame改为gray即可
    cv2.imwrite("why"+str(int(i/fps))+".png",frame)
  #读完之后结束退出
  if cv2.waitKey(1)==ord('q'):
    break

cap.release()
cv2.destoryAllWindows()


#1.3图像像素修改
rangexmin=100
rangexmax=120
rangeymin=90
rangeymax=100
img=cv2.imread('Myhero.jpg',0)
img[rangexmin:rangexmax,rangeymin:rangeymax]=[[255]*(rangeymax-rangeymin)]*(rangexmax-rangexmin)
cv2.imwrite('Myhero_out2.png',img)

#拆分以及合并图像通道1
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)

#png转eps,不过非常模糊
from matplotlib import pyplot as plt
img=cv2.imread('wechat1.png',cv2.IMREAD_COLOR)
plt.imsave('wechat_out.eps',img)

#图像按比例混合
img1=cv2.imread('Myhero.jpg',cv2.IMREAD_COLOR)
img2=cv2.imread('Myhero_out.png',cv2.IMREAD_COLOR)
dst=cv2.addWeighted(img1,0.5,img2,0.5,0)
cv2.imwrite("Myhero_combi.jpg",dst)


#1.4按位运算
#加载图像
img1=cv2.imread("Myhero.jpg")
img2=cv2.imread("why1.png")
#后面那张图更大
rows,cols,channels=img1.shape
ROI=img2[0:rows,0:cols]
#做一个ROI为图像的大小
img2gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
#小于175的改为0,大于175的赋值为255
ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
cv2.imwrite("Myhero_mask.jpg",mask)
#255-mask=mask_inv
mask_inv=cv2.bitwise_not(mask)
cv2.imwrite("Myhero_mask_inv.jpg",mask_inv)
#在mask白色区域显示成ROI,背景图片
img2_bg=cv2.bitwise_and(ROI,ROI,mask=mask)
cv2.imwrite("Myhero_pic2_backgroud.jpg",img2_bg)
#除了mask以外的区域都显示成img1,前景图片
img1_fg=cv2.bitwise_and(img1,img1,mask=mask_inv)
cv2.imwrite("Myhero_pic2_frontgroud.jpg",img1_fg)
#前景图片加上背景图片
dst = cv2.add(img2_bg,img1_fg)
img2[0:rows, 0:cols ] = dst
cv2.imwrite("Myhero_pic2_addgroud.jpg",dst)
#finished

#构建淹膜方法2
#截取帧
ret,frame=cap.read()
#转换到HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
#设定蓝色的阈值
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
#根据阈值构建掩模
mask=cv2.inRange(hsv,lower_blue,upper_blue)
#对原图像和掩模进行位运算
res=cv2.bitwise_and(frame,frame,mask=mask)


#图片放缩,用的插值方法,所以不会损害清晰度
res=cv2.resize(img1,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
cv2.imwrite("Myhero_bigger.jpg",res)
#第二种插值方法
height,width=img.shape[:2]
res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)

#edge现实图片中不好用,人工画的图片还可以
img = cv2.imread('why3.png',0)
edges = cv2.Canny(img,50,100)
cv2.imwrite("why3_edge.png",edges)

#识别轮廓,并保存轮廓点contours
img=cv2.imread('why129.png')
imgray=cv2.imread('why129.png',cv2.IMREAD_GRAYSCALE)
ret,thresh = cv2.threshold(imgray,127,255,0)
cv2.imwrite("2.jpg",thresh)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContours(img, contours, -1, (0,255,0), 3)
cv2.imwrite("3.jpg",img)


#轮廓
img = cv2.imread('why3.png',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0] 
#近似轮廓
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

img = cv2.drawContours(img, approx, -1, (0,255,0), 3)
cv2.imwrite("4.jpg",img)

from matplotlib import pyplot as plt
#图像识别/匹配
img_rgb = cv2.imread('why174.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
img2=img_gray.copy()
template = cv2.imread('0temp.png',0)
w, h = template.shape[::-1]
#共有六种识别方法
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for meth in methods:
  img = img2.copy()
  #eval返回某个式子的计算结果
  method = eval(meth)
  #下面使用匹配方法
  res = cv2.matchTemplate(img,template,method)
  min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
    top_left = min_loc
  else:
    top_left = max_loc
  bottom_right = (top_left[0] + w, top_left[1] + h)
  #画矩形把他框出来
  cv2.rectangle(img,top_left, bottom_right, 255, 2)
  
  plt.subplot(121),plt.imshow(res,cmap = 'gray')
  plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
  plt.subplot(122),plt.imshow(img,cmap = 'gray')
  plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
  plt.suptitle(meth)
  
  plt.show()
  
#这个匹配结果太差
#选取3,5,6的匹配方式会稍微好点:cv2.TM_CCORR;cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED

#视频人脸识别
#https://blog.csdn.net/wsywb111/article/details/79152425
import cv2
from PIL import Image
cap=cv2.VideoCapture("why.mp4")
#告诉Opencv使用人脸识别分类器
classfier=cv2.CascadeClassifier("E:\\0yfl\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_alt2.xml")
count=0
while cap.isOpened():
  ret,frame=cap.read()
  if not ret:
    break
  grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  faceRect=classfier.detectMultiScale(grey,scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
  if len(faceRect)>0:
    count=count+1
print(count)


#137这种程度可以识别,111没有成功识别,大概是侧脸的缘故
#截出人脸
image_name="why111.png"
frame=cv2.imread(image_name,0)
if not (frame is None):
  #导入测试集
  classfier=cv2.CascadeClassifier("E:\\0yfl\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_alt2.xml")
  #使用测试集导出人脸的位置,存在faceRect中,可以检测多张人脸
  faceRect=classfier.detectMultiScale(frame,scaleFactor=3.0, minNeighbors=3, minSize=(32, 32))
  count=0
  for (x1,y1,w,h) in faceRect:
    count=count+1
    #截取上述图片的人脸部分并保存每一张识别出的人脸
    Image.open(image_name).crop((x1,y1,x1+w,y1+h)).save(image_name.split(".")[0]+"_face_"+str(count)+".png")
  if count==0:
    print ("No face detected!")
else:
  print ("Picture "+ image_name +" is not exist in "+os.path.abspath("."))
#人脸上画出矩形
from PIL import Image,ImageDraw
image_name="why111.png"
frame=cv2.imread(image_name,0)
if not (frame is None):
  classfier=cv2.CascadeClassifier("E:\\0yfl\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_alt2.xml")
  faceRect=classfier.detectMultiScale(frame,scaleFactor=3.0, minNeighbors=3, minSize=(32, 32))
  #画框框
  img = Image.open(image_name)
  draw_instance = ImageDraw.Draw(img)
  count=0
  for (x1,y1,w,h) in faceRect:
    draw_instance.rectangle((x1,y1,x1+w,y1+h), outline=(255, 0,0))
    img.save('drawfaces_'+image_name)
    count=count+1
  if count==0:
    print ("No face detected!")
else:
  print ("Picture "+ image_name +" is not exist in "+os.path.abspath("."))


#detectFaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点)
#使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。
#注:haarcascades目录下训练好的分类器必须以灰度图作为输入。


from PIL import Image,ImageDraw
image_name="why63.png"
frame=cv2.imread(image_name,0)
if not (frame is None):
  classfier=cv2.CascadeClassifier("E:\\0yfl\\opencv-master\\data\\haarcascades\\haarcascade_fullbody.xml")
  faceRect=classfier.detectMultiScale(frame,scaleFactor=3.0, minNeighbors=3, minSize=(32, 32))
  #画框框
  img = Image.open(image_name)
  draw_instance = ImageDraw.Draw(img)
  count=0
  for (x1,y1,w,h) in faceRect:
    draw_instance.rectangle((x1,y1,x1+w,y1+h), outline=(255, 0,0))
    img.save('drawfaces_'+image_name)
    count=count+1
  if count==0:
    print ("No face detected!")
else:
  print ("Picture "+ image_name +" is not exist in "+os.path.abspath("."))

以上就是python 实时调取摄像头的示例代码的详细内容,更多关于python 调取摄像头的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
基于Python实现的扫雷游戏实例代码
Aug 01 Python
python通过yield实现数组全排列的方法
Mar 18 Python
解决python删除文件的权限错误问题
Apr 24 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
python实现猜单词小游戏
May 22 Python
基于python实现名片管理系统
Nov 30 Python
Python地图绘制实操详解
Mar 04 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python 实现控制鼠标键盘
Nov 27 Python
详解Python牛顿插值法
May 11 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
Python存储读取HDF5文件代码解析
Nov 25 #Python
python 简单的调用有道翻译
Nov 25 #Python
浅析Python的命名空间与作用域
Nov 25 #Python
重构Python代码的六个实例
Nov 25 #Python
python try...finally...的实现方法
Nov 25 #Python
通过Python pyecharts输出保存图片代码实例
Nov 25 #Python
如何基于Python和Flask编写Prometheus监控
Nov 25 #Python
You might like
PHP5中MVC结构学习
2006/10/09 PHP
PHP 危险函数全解析
2009/09/09 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
PHP静态文件生成类实例
2014/11/29 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
python exit出错原因整理
2020/08/31 Python
Python 串口通信的实现
2020/09/29 Python
用python对oracle进行简单性能测试
2020/12/05 Python
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
初一生物教学反思
2014/01/18 职场文书
大学生秋游活动方案
2014/02/17 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
百年校庆节目主持词
2014/03/27 职场文书
股份转让协议书
2014/04/12 职场文书
论文评语大全
2014/04/29 职场文书
避暑山庄导游词
2015/02/04 职场文书
道歉信怎么写
2015/05/12 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server