相機用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...