基於語言python,主要運用的包有cv2等
1.在python中實現攝像頭的影象獲取
安裝opencv:
1. 安裝依賴
pip install --upgrade setuptools
pip install numpy matplotlib
2.安裝opencv python版
pip install opencv-python
實現攝像頭影象獲取**
#-*- coding:utf-8 -*-3.第一次嘗試import cv2
import time
cap = cv2.videocapture(0)#調取攝像頭,0表示系統預設攝像頭
while true:
ret,photo = cap.read()#讀取影象
cv2.imshow('please take our photo!',photo)#將影象傳送自視窗
key = cv2.waitkey(2)#設定等待時間,若為0影象定格
if key == ord(" "):#輸入空格截圖
filename = time.strftime('%y%m%d-%h%m%s')+".jpg"#檔名為當前時間
cv2.imwrite(filename,photo)#儲存位置
if key == ord('q'):#輸入q退出
break
想用去背景後獲取二值影象,然後檢測凸包的方式來識別手勢,效果很差
實時去掉背景**
比對手勢形狀**(完全行不通)
# -*- coding:utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
im = cv2.imread('test1.jpg')#需要識別的圖
im2 = cv2.imread('ex2.jpg')#標準例圖
kernel = cv2.getstructuringelement(cv2.morph_ellipse,(3,3))#3*3的橢圓核
img = cv2.cvtcolor(im,cv2.color_bgr2gray)#用這個方式轉換的原因是最後輸出時希望能看到彩色的的輪廓圖
img2 = cv2.cvtcolor(im2,cv2.color_bgr2gray)
ret,thresh = cv2.threshold(img,127,255,0)
ret,thresh2 = cv2.threshold(img2,127,255,0)#將影象二值化
dst = cv2.morphologyex(thresh,cv2.morph_open,kernel)
dst2 = cv2.morphologyex(thresh2,cv2.morph_open,kernel)#將影象進行開運算
img,contours,hierarchy = cv2.findcontours(dst,1,2)
max = 0
maxl = -1
for i in range(len(contours)):
if cv2.contourarea(contours[i]) > max :
max = cv2.contourarea(contours[i])
maxl = i
print(maxl)
print(len(contours))
cnt = contours[maxl]#找到需識別圖中最大的輪廓,即手的輪廓
img,contours,hierarchy = cv2.findcontours(dst2,1,2)
cnt2 = contours[len(contours)-1]#對照例圖中手的輪廓
cv2.drawcontours(im,[cnt],0,(0,255,0),3)
ret = cv2.matchshapes(cnt,cnt2,1,0.0)
print(ret)#將兩輪廓進行比對
# cv2.imshow('img',img)
# cv2.imshow('thresh',thresh)
cv2.imshow('im',im)
cv2.waitkey(0)
識別凸包**(準確度低)
kernel = cv2.getstructuringelement(cv2.morph_ellipse,(3,3))#3*3的橢圓核
img = cv2.cvtcolor(im,cv2.color_bgr2gray)#用這個方式轉換的原因是最後輸出時希望能看到彩色的的輪廓圖
ret,thresh = cv2.threshold(img,127,255,0)
dst = cv2.morphologyex(thresh,cv2.morph_open,kernel)
img,contours,hierarchy = cv2.findcontours(dst,1,2)
max = 0
maxl = -1
for i in range(len(contours)):
if cv2.contourarea(contours[i]) > max :
max = cv2.contourarea(contours[i])
maxl = i
print(maxl)
print(len(contours))
cnt = contours[maxl]#找到需識別圖中最大的輪廓,即手的輪廓
#顯示凸包
hull = cv2.convexhull(cnt,returnpoints=true)
print(hull)
cv2.polylines(im, [hull], true, (0, 255, 0), 2)
#凸性檢測
# hull = cv2.convexhull(cnt,returnpoints=false)
# defect = cv2.convexitydefects(cnt,hull)
## for i in range(defect.shape[0]):
# s,e,f,d = defect[i,0]
# start = tuple(cnt[s][0])
# end = tuple(cnt[e][0])
# far = tuple(cnt[f][0])
# # cv2.line(im,start,end,[0,255,0],2)
# # cv2.circle(im,start,5,[0,0,255],-1)
# # cv2.circle(im,end,5,[0,0,255],-1)
# cv2.circle(im,far,5,[0,0,255],-1)
m = cv2.moments(cnt)
cx = int(m['m10']/m['m00'])
cy = int(m['m01']/m['m00'])
cv2.circle(im,(cx,cy),5,[0,0,255],-1)
cv2.imshow('img',im)
cv2.waitkey(0)
分析原因,是因為
1)背景雜質太多,且由於使用了筆記本自帶攝像頭,無法單獨識別到手
2)光線不均勻,導致背景減除時無法準確識別到整個手的完整輪廓
綜上,該方法在要求實現條件更為廣泛的情況下不太行得通
計算機色彩控制
我們軟體工程導論的授課老師講到 計算機只會0101地執行人們的命令。不對!那只是cpu該幹的事,一台完整的pc可不僅僅只有cpu,音效卡 音響,顯示卡 顯示器,都是一台計算機該有的裝置。那麼cpu 0101的二進位制制訊號是如何控制色彩和聲音的呢?首先讓我們來了解一下計算機 顯示 顯示卡 全稱顯示介...
實現計算機
實現乙個計算器 實現兩個運算元 小數和整數均可 的加 減 乘 除 清零操作。1.加法運算 2.減法運算 3.乘法運算 4.除法運算 64 16 4 using system using system.collections.generic using system.componentmodel us...
大話計算機 計算機系統 硬體 控制器
運算器只能完成運算,而如何保證這些運算的正確執行,以及出錯了如何處理它等這些,都需要控制器來控制。控制器用於控制cpu的工作,它決定了計算機執行的過程的自動化。控制器主要由指令 時序 匯流排和中斷等控制邏輯組成。用一張思維導圖概括更直觀些。下面主要介紹控制器中的指令控制邏輯。當cpu 在執行一條指令...