Python OpenCV通過攝像頭實現計數

2021-10-13 13:54:21 字數 3016 閱讀 3986

相機用opencv打不開,用的廠家提供的封裝庫

因為採集到的影象直接就被轉換成標準格式資料,所以不需要imread讀取,又因為測試的是黑白攝像頭,所以也不需要轉為灰度圖

import cv2

import numpy as np

import pyzbar.pyzbar as pyzbar

from dvp import *

def frame2mat(framebuffer):

frame, buffer = framebuffer

bits = np.uint8 if(frame.bits == bits.bits_8) else np.uint16

shape = none

converttype = none

if(frame.format >= imageformat.format_mono and frame.format <= imageformat.format_bayer_rg):

shape = 1

elif(frame.format == imageformat.format_bgr24 or frame.format == imageformat.format_rgb24):

shape = 3

elif(frame.format == imageformat.format_bgr32 or frame.format == imageformat.format_rgb32):

shape = 4

else:

return none

mat = np.frombuffer(buffer, bits)

mat = mat.reshape(frame.iheight, frame.iwidth, shape) #轉換維度

return mat

camera = camera(0)#以索引號的方式開啟相機

cv2.namedwindow(u"camera",0)#可以拖動視窗大小

cv2.resizewindow(u"camera", 640, 480)#設定視窗大小

cv2.movewindow(u"camera",1200,500)#設定視窗位置

while (cv2.waitkey(1) != 27):

frame = camera.getframe(3000)#從相機採集影象資料,超時時間為3000毫秒

mat = frame2mat(frame)#轉換為標準資料格式

font=cv2.font_hershey_******x

kernel = np.ones((7,7),np.uint8)

# 灰度圖

#gray_img = cv2.cvtcolor(mat, cv2.color_bgr2gray)

#cv2.imshow(u"gray_img", gray_img)

# 二值化,返回兩個資料,第乙個是ret,第二個是二值化後的影象,後面的[1]表示返回二值化後的影象

th1=cv2.threshold(mat,120,255,cv2.thresh_binary)[1]

# 形態腐蝕

erosion = cv2.erode(th1,kernel,iterations = 1)

# 距離變換

dist_img = cv2.distancetransform(erosion, cv2.dist_l1, cv2.dist_mask_3)#距離變換

# 歸一化

dist_output = cv2.normalize(dist_img, 0, 1.0, cv2.norm_minmax)

# 又二值化

th2=cv2.threshold(dist_output*80,0.3,255,cv2.thresh_binary)[1]

# kernel = np.ones((5,5),np.uint8)

opening = cv2.morphologyex(th2, cv2.morph_open, kernel)

opening = np.array(opening,np.uint8)

count=0

for cnt in contours:

(x,y),radius = cv2.minenclosingcircle(cnt)

center = (int(x),int(y))

radius = int(radius)

circle_img = cv2.circle(opening,center,radius,(255,255,255),1)

area = cv2.contourarea(cnt)

area_circle=3.14*radius*radius

#print(area/area_circle)

if area/area_circle <=0.5:

img = cv2.drawcontours(img, cnt, -1, (0,0,255), 5)#差(紅色)

#img=cv2.puttext(img,'bad',center,font,0.5,(0,0,255),2)

elif area/area_circle >=0.6:

img = cv2.drawcontours(img, cnt, -1, (0,255,0), 5)#優(綠色)

#img=cv2.puttext(img,'good',center,font,0.5,(0,0,255),2)

else:

img = cv2.drawcontours(img, cnt, -1, (255,0,0), 5)#良(藍色)

#img=cv2.puttext(img,'normal',center,font,0.5,(0,0,255),2)

count+=1

img=cv2.puttext(mat,('sum='+str(count)),(50,50),font,1,(255,0,0))

cv2.imshow('camera',img)

print('共有:',count)

但是執行後,效果感覺8行

計數在總數一半附近波動

當場裂開

python opencv 安裝整理

這兩天比較有空,在公司內想學習一下opencv,又不想安裝vc 所以就那個python看opencv。安裝環境本來很簡單 但是我python是64的 估計也很多 而opencv的安裝要有乙個numpy庫 這個在官網上只有32位的 所以,事情變得複雜起來。網上找了一下,只道有提供64位版的numpy庫...

python opencv 輪廓檢測

輪廓 contours 指的是有相同顏色或者密度,連線所有連續點的一條曲線。檢測輪廓的工作對形狀分析和物體檢測與識別都非常有用。在輪廓檢測之前,首先要對進行二值化或者canny邊緣檢測。在opencv中,尋找的物體是白色的,而背景必須是黑色的,因此預處理時必須保證這一點。import cv2 讀入i...

python opencv 輪廓屬性

import cv2 import numpy as np 高寬比 函式cv2.moments 會給你乙個字典,包含所有矩值 m cv2.moments cnt 這是目標的邊界矩形的寬高比 x,y,w,h cv2.boundingrect cnt aspect ratio float w h ext...