大西洋眼镜店 發表於 2019-11-19 14:49:00

python调用摄像头

<p>1.python实时调取本地摄像头</p>
<div class="cnblogs_code">
<pre>import numpy <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> np
import cv2
cap </span>= cv2.VideoCapture(<strong><span style="color: rgba(128, 0, 128, 1)">0</span></strong><span style="color: rgba(0, 0, 0, 1)">)    #参数为0时调用本地摄像头;url连接调取网络摄像头;文件地址获取本地视频
</span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)">(True):
ret,frame</span>=<span style="color: rgba(0, 0, 0, 1)">cap.read()

#灰度化
gray</span>=<span style="color: rgba(0, 0, 0, 1)">cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">frame</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,gray)

#普通图片
cv2.imshow(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">frame</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,frame)

</span><span style="color: rgba(0, 0, 255, 1)">if</span> cv2.waitKey(<span style="color: rgba(128, 0, 128, 1)">1</span>)&amp;<span style="color: rgba(128, 0, 128, 1)">0xFF</span>==ord(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">q</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">
cap.release()
cv2.destroyAllWindows()</span></pre>
</div>
<p>&nbsp;</p>
<p>2.opencv代码</p>
<div class="cnblogs_code">
<pre># -*- coding: utf-<span style="color: rgba(128, 0, 128, 1)">8</span> -*-
<span style="color: rgba(128, 0, 0, 1)">"""
</span><span style="color: rgba(0, 0, 0, 1)">Spyder Editor

This </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a temporary script file.
</span><span style="color: rgba(128, 0, 0, 1)">"""
</span><span style="color: rgba(0, 0, 0, 1)">
#设置工作路径
import os
os.chdir(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\0yfl\\SH-spyder-workspace\\</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
os.path.abspath(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)


import numpy </span><span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> np
import cv2

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


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

cap.release()
cv2.destoryAllWindows()


#</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.3图像像素修改
rangexmin</span>=<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">
rangexmax</span>=<span style="color: rgba(128, 0, 128, 1)">120</span><span style="color: rgba(0, 0, 0, 1)">
rangeymin</span>=<span style="color: rgba(128, 0, 128, 1)">90</span><span style="color: rgba(0, 0, 0, 1)">
rangeymax</span>=<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">
img</span>=cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Myhero.jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
img</span>=[[<span style="color: rgba(128, 0, 128, 1)">255</span>]*(rangeymax-rangeymin)]*(rangexmax-<span style="color: rgba(0, 0, 0, 1)">rangexmin)
cv2.imwrite(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Myhero_out2.png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,img)

#拆分以及合并图像通道1
b,g,r</span>=<span style="color: rgba(0, 0, 0, 1)">cv2.split(img)
img</span>=<span style="color: rgba(0, 0, 0, 1)">cv2.merge(b,g,r)

#png转eps,不过非常模糊
</span><span style="color: rgba(0, 0, 255, 1)">from</span> matplotlib import pyplot <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> plt
img</span>=cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wechat1.png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,cv2.IMREAD_COLOR)
plt.imsave(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wechat_out.eps</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,img)

#图像按比例混合
img1</span>=cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Myhero.jpg</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,cv2.IMREAD_COLOR)
img2</span>=cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Myhero_out.png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,cv2.IMREAD_COLOR)
dst</span>=cv2.addWeighted(img1,<span style="color: rgba(128, 0, 128, 1)">0.5</span>,img2,<span style="color: rgba(128, 0, 128, 1)">0.5</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
cv2.imwrite(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Myhero_combi.jpg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,dst)


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

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


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

#edge现实图片中不好用,人工画的图片还可以
img </span>= cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">why3.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
edges </span>= cv2.Canny(img,<span style="color: rgba(128, 0, 128, 1)">50</span>,<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">)
cv2.imwrite(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">why3_edge.png</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,edges)

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


#轮廓
img </span>= cv2.imread(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">why3.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
ret,thresh </span>= cv2.threshold(img,<span style="color: rgba(128, 0, 128, 1)">127</span>,<span style="color: rgba(128, 0, 128, 1)">255</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
contours,hierarchy </span>= cv2.findContours(thresh, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">)
cnt </span>= contours[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]
#近似轮廓
epsilon </span>= <span style="color: rgba(128, 0, 128, 1)">0.1</span>*<span style="color: rgba(0, 0, 0, 1)">cv2.arcLength(cnt,True)
approx </span>=<span style="color: rgba(0, 0, 0, 1)"> cv2.approxPolyDP(cnt,epsilon,True)

img </span>= cv2.drawContours(img, approx, -<span style="color: rgba(128, 0, 128, 1)">1</span>, (<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">255</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>), <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)
cv2.imwrite(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">4.jpg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,img)

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

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

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


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


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


</span><span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> PIL import Image,ImageDraw
image_name</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">why63.png</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
frame</span>=cv2.imread(image_name,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> not (frame <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> None):
    classfier</span>=cv2.CascadeClassifier(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">E:\\0yfl\\opencv-master\\data\\haarcascades\\haarcascade_fullbody.xml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    faceRect</span>=classfier.detectMultiScale(frame,scaleFactor=<span style="color: rgba(128, 0, 128, 1)">3.0</span>, minNeighbors=<span style="color: rgba(128, 0, 128, 1)">3</span>, minSize=(<span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">))
    #画框框
    img </span>=<span style="color: rgba(0, 0, 0, 1)"> Image.open(image_name)
    draw_instance </span>=<span style="color: rgba(0, 0, 0, 1)"> ImageDraw.Draw(img)
    count</span>=<span style="color: rgba(128, 0, 128, 1)">0</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> (x1,y1,w,h) <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> faceRect:
      draw_instance.rectangle((x1,y1,x1</span>+w,y1+h), outline=(<span style="color: rgba(128, 0, 128, 1)">255</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">))
      img.save(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">drawfaces_</span><span style="color: rgba(128, 0, 0, 1)">'</span>+<span style="color: rgba(0, 0, 0, 1)">image_name)
      count</span>=count+<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> count==<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">:
      print (</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">No face detected!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
    print (</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Picture </span><span style="color: rgba(128, 0, 0, 1)">"</span>+ image_name +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> is not exist in </span><span style="color: rgba(128, 0, 0, 1)">"</span>+os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>))</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/StarZhai/p/11889421.html
頁: [1]
查看完整版本: python调用摄像头