【发布时间】:2021-02-21 18:51:07
【问题描述】:
import cv2
import numpy as np
kam = cv2.VideoCapture(0)
foto = cv2.imread('resim.jpg')
def foto_cevirme(fotogir):
hsv = cv2.cvtColor(fotogir,cv2.COLOR_BGR2HSV)
fotogir = cv2.blur(fotogir,(3,3))
lower_red = np.array([0,120,70])
upper_red = np.array([10,255,255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170,120,70])
upper_red = np.array([180,255,255])
mask2 = cv2.inRange(hsv,lower_red,upper_red)
mask1 = mask1+mask2
(contours,hierarchy) = cv2.findContours(mask1.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
if cv2.contourArea(c) < 500:
continue
(x,y,w,h) = cv2.boundingRect(c)
cv2.rectangle(fotogir,(x,y),(x+w,y+h),(255,0,0),3)
global face_width
face_width = w
return face_width
res1 = cv2.bitwise_and(fotogir,fotogir,mask=mask1)
cv2.imshow("foto",fotogir)
known_distance = 40 # kameraya uzaklik
known_width = 20 # yüzünüzün ortalam genisligi
def focal_length(measured_distance, real_width, width_in_rf_image):
focal_length = (width_in_rf_image * measured_distance)/ real_width
return focal_length
def distance_finder(Focal_length,real_face_width,face_width_in_frame):
distance = (real_face_width* Focal_length)/ face_width_in_frame
return distance
fotokare = foto_cevirme(foto)
ref_image_face_width = fotokare
focal_length_found = focal_length(known_distance,known_width,ref_image_face_width)
fonts = cv2.FONT_HERSHEY_COMPLEX
while True:
ret, goruntu = kam.read()
hsv = cv2.cvtColor(goruntu,cv2.COLOR_BGR2HSV)
goruntu = cv2.blur(goruntu,(8,8))
lower_red = np.array([0,120,70])
upper_red = np.array([10,255,255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170,120,70])
upper_red = np.array([180,255,255])
mask2 = cv2.inRange(hsv,lower_red,upper_red)
mask1 = mask1+mask2
(contours,hierarchy) = cv2.findContours(mask1.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
if cv2.contourArea(c) < 500:
continue
else:
exit
(x,y,w,h) = cv2.boundingRect(c)
genislik = w
Distance = distance_finder(focal_length_found,known_width,genislik)
cv2.putText(goruntu,f"Uzaklik = {Distance}",(50,50),fonts,1,(0,0,255),2)
res1 = cv2.bitwise_and(goruntu,goruntu,mask=mask1)
cv2.imshow("orj",goruntu)
cv2.imshow("mask",mask1)
cv2.imshow("res",res1)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
kam.release()
cv2.destroyAllWindows()
【问题讨论】:
-
您好,我正在尝试颜色检测和距离程序,但是当我尝试定义 w(宽度)时,它给我的 genislik 没有定义?为什么
-
此评论没有解决您的问题,但我想分享。在您的函数
foto_cevirme(fotogir)中,您有一个return 语句。之后有2条语句。它永远不会被执行,因为代码已经到达 return 语句 -
距离 = distance_finder(focal_length_found,known_width,genislik) 之前的 for 循环有点棘手。如果 c 的所有值都导致
< 500,则不会定义genislik。如果它大于或等于 500,则您要求它退出。代码(x,y,w,h) = cv2.boundingRect(c)和genislik = w永远不会执行。所以当它到达Distance时,你就有了一个未定义的变量 -
感谢您的 cmets 我了解这些问题,但仍然不知道如何解决此问题
-
为
genislik设置默认值
标签: python opencv image-processing