【问题标题】:NameError: name 'width' is not defineddNameError:名称“宽度”未定义
【发布时间】: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 的所有值都导致 &lt; 500,则不会定义 genislik。如果它大于或等于 500,则您要求它退出。代码(x,y,w,h) = cv2.boundingRect(c)genislik = w 永远不会执行。所以当它到达Distance时,你就有了一个未定义的变量
  • 感谢您的 cmets 我了解这些问题,但仍然不知道如何解决此问题
  • genislik设置默认值

标签: python opencv image-processing


【解决方案1】:

我尝试使用 cmets 部分来解释这一点。让我分享截图来解释一下。

您需要通过分配默认值来求解变量genislik。 for 循环中的代码永远不会被执行。

代码中的exit 命令实际上会退出程序而不仅仅是循环。我假设你试图打破循环。在图像中exit 实际上取消了程序。改为break

您在这里也面临着类似的挑战。您需要为face_width 设置一个默认值,否则,它会给您一个错误,指出face_width 未定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-01-26
    • 2021-10-05
    • 2017-08-16
    相关资源
    最近更新 更多