焦距=像素*距離/實際寬度。
距離=實際寬度*焦距/像素
import cv2
import time
from collections import deque
import numpy as np
#設定藍色閾值,HSV空間
blueLower = np.array([100, 100, 100])
blueUpper = np.array([120, 255, 255])
#初始化追蹤點的列表
mybuffer = 64
pts = deque(maxlen=mybuffer)
#打開攝像頭
camera = cv2.VideoCapture(0)
#等待兩秒
time.sleep(2)
#創建一個線程類
def ceju_xianshi():
while True:
# 讀取幀
(ret, frame) = camera.read()
frame = cv2.flip(frame, 1, dst=None) # 水平鏡像
# 判斷是否成功打開攝像頭
if not ret:
print('No Camera')
break
# frame = imutils.resize(frame, width=600)
# 轉到HSV空間
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根據閾值構建掩膜
mask = cv2.inRange(hsv, blueLower, blueUpper)
# 腐蝕操作
mask = cv2.erode(mask, None, iterations=2)
# 膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點
mask = cv2.dilate(mask, None, iterations=2)
# 輪廓檢測
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 初始化瓶蓋圓形輪廓質心
center = None
# 如果存在輪廓
if len(cnts) > 0:
# 找到面積最大的輪廓
c = max(cnts, key=cv2.contourArea)
# 確定面積最大的輪廓的矩形
x, y, w, h = cv2.boundingRect(c)
# 計算輪廓的矩
M = cv2.moments(c)
# 計算質心
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
# 只有當半徑大於10時,才執行畫圖
a = int(M["m10"] / M["m00"])
b = int(M["m01"] / M["m00"])
juli = 1268/w*2.54
print(juli)#輸出距離
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2) # 顯示矩形框
cv2.circle(frame, center, 1, (0, 0, 255), -1) # 顯示圓心
cv2.imshow('Frame', frame)
cv2.waitKey(1)
# 攝像頭釋放
if __name__ == '__main__':
ceju_xianshi()
第二版
import cv2
import time
import numpy as np
#設定藍色閾值,HSV空間
blueLower = np.array([100, 100, 100])
blueUpper = np.array([120, 255, 255])
#打開攝像頭
camera = cv2.VideoCapture(0)
#創建一個線程類
def ceju_xianshi():
while True:
# 讀取幀
(ret, frame) = camera.read()
frame = cv2.flip(frame, 1, dst=None) # 水平翻轉鏡像
# 判斷是否成功打開攝像頭
if not ret:
print('No Camera')
break
# 轉到HSV空間
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根據閾值構建掩膜
mask = cv2.inRange(hsv, blueLower, blueUpper)
# 腐蝕操作
mask = cv2.erode(mask, None, iterations=2)
# 膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點
mask = cv2.dilate(mask, None, iterations=2)
# 輪廓檢測
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 如果存在輪廓
if len(cnts) > 0:
# 找到面積最大的輪廓
c = max(cnts, key=cv2.contourArea)
# 確定面積最大的輪廓的矩形
x, y, w, h = cv2.boundingRect(c)
#計算目標距離
juli = 1268/w*2.54
# 輸出距離
print(juli)
# 顯示矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('Frame', frame)
cv2.waitKey(1)
# 攝像頭釋放
if __name__ == '__main__':
ceju_xianshi()
第三版樹莓派攝像頭,修改了參數
import cv2
import time
import numpy as np
#設定藍色閾值,HSV空間
blueLower = np.array([80, 100, 100])
blueUpper = np.array([100, 255, 255])
#打開攝像頭
camera = cv2.VideoCapture(0)
#創建一個線程類
def ceju_xianshi():
while True:
# 讀取幀
(ret, frame) = camera.read()
frame = cv2.flip(frame, 1, dst=None) # 水平翻轉鏡像
# 判斷是否成功打開攝像頭
if not ret:
print('No Camera')
break
# 轉到HSV空間
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根據閾值構建掩膜
mask = cv2.inRange(hsv, blueLower, blueUpper)
# 腐蝕操作
mask = cv2.erode(mask, None, iterations=2)
# 膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點
mask = cv2.dilate(mask, None, iterations=2)
# 輪廓檢測
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 如果存在輪廓
if len(cnts) > 0:
# 找到面積最大的輪廓
c = max(cnts, key=cv2.contourArea)
# 確定面積最大的輪廓的矩形
x, y, w, h = cv2.boundingRect(c)
#計算目標距離
juli = (1029.006/w)*2.54
# 輸出距離
print("juli",juli)
print("shijikuandu",w)
# 顯示矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('Frame', frame)
cv2.waitKey(1)
# 攝像頭釋放
if __name__ == '__main__':
ceju_xianshi()
第四版,增加顯示功能
import cv2
import time
import numpy as np
#設定藍色閾值,HSV空間
blueLower = np.array([80, 100, 100])
blueUpper = np.array([100, 255, 255])
#打開攝像頭
camera = cv2.VideoCapture(0)
#創建一個xianshifangfa
def ceju_xianshi():
while True:
# 讀取幀
(ret, frame) = camera.read()
frame = cv2.flip(frame, 1, dst=None) # 水平翻轉鏡像
# 判斷是否成功打開攝像頭
if not ret:
print('No Camera')
break
# 轉到HSV空間
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根據閾值構建掩膜
mask = cv2.inRange(hsv, blueLower, blueUpper)
# 腐蝕操作
mask = cv2.erode(mask, None, iterations=2)
# 膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點
mask = cv2.dilate(mask, None, iterations=2)
# 輪廓檢測
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 如果存在輪廓
if len(cnts) > 0:
# 找到面積最大的輪廓
c = max(cnts, key=cv2.contourArea)
# 確定面積最大的輪廓的矩形
x, y, w, h = cv2.boundingRect(c)
#計算目標距離
juli = (1029.006/w)*2.54
juli1 = str(juli)
# 輸出距離
print("juli",juli1)
print("shijikuandu",w)
# 顯示矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(frame, juli1, (30, 300), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)#shipin_zhong,xinshi_juli
cv2.imshow('Frame', frame)
cv2.waitKey(1)
# 攝像頭釋放
if __name__ == '__main__':
ceju_xianshi()
本次對亮度和顏色範圍進行了調整,
只識別這種藍色