反投影和开放问题

2024-09-30 05:31:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用opencv实现一个反投影算法来检测手。该算法由多个源组成。为了得到更好的结果,我尝试了多种方法,比如形态学和添加背景减法。然而,我继续得到下面的照片。有人对我可能做错什么有什么建议吗?在

-谢谢

这是我的代码,只有反投影:

import cv2
import numpy as np

#module for esc keyMap on my computer
import keyMappings as kM

#set up webcam
cap = cv2.VideoCapture(0)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 1000) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 600)

#read a picture of a hand from my desktop
Hand = cv2.imread('/home/lie/Desktop/handPic.jpg')

#convert HSV and calc Histogram of this Pic
hsvHand = cv2.cvtColor(Hand, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsvHand)
roihist = cv2.calcHist([hsvHand], [0,1], None, [180,256],[0,180,0,256])
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)

#while not pressing esc
while cv2.waitKey(30) != kM.esc:

  #take pic convert HSV
  _,frame = cap.read() 
  hsvt = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

  #backproject
  dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)


  #filtering
  disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
  cv2.filter2D(dst,-1,disc,dst)



  #threshold
  ret,thresh = cv2.threshold(dst,50,255,0)


   #find contours in thresholded pic
   contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


   ci =0
   max_area =0

   if len(contours)!=0:
      #find max contour
      for i in range(len(contours)):
        cnt = contours[i]
        area = cv2.contourArea(cnt)
        if(area>max_area):
            max_area = area
            ci =i
      #create hull around contour
      cnt = contours[ci]
      hull = cv2.convexHull(cnt)

 #Code to draw contours and show pic is ommited

这是用来帮助识别手的图像: Image read in as Picture of a Hand

这是阈值图片: enter image description here

很明显,这张照片显示的手不多,噪音很大。在


Tags: import算法ciareacv2maxdstcap
1条回答
网友
1楼 · 发布于 2024-09-30 05:31:32

从这篇文章开始已经很长时间了,坦白地说,我有点惊讶没有人回复你。虽然我很确定你已经找到了答案/替代方案,但为了其他人的利益,我会回答这个问题。在

你所观察到的是由你在H-S直方图中使用的箱子数量直接造成的。更多的箱子意味着你将更精细地代表皮肤,这意味着你最终的直方图将无法建立一个皮肤的“趋势”。你应该绝对减少垃圾箱的数量。以我的经验,8到12之间的任何色调和饱和度通道都能很好地工作。在

然而,这样做并不能保证一个非常好的反投影图像。你仍然有一个主要的问题,那就是你使用整个手模板来生成你的直方图。事实上,这个模板包含了很多皮肤,但是手周围有很多不是皮肤的区域。最终生成的直方图也将表示背景。在我的经验中(我有很多),即使是相对较小的噪声过滤到最终的直方图中,也会在反向投影图像中产生大量的噪声。将直方图中的背景保持在最小值是关键。所以考虑在你的手模板里取一小块区域,然后只在上面生成直方图。我修改了你的代码如下,它像一个梦在我的配置。在

请注意,我做了一些更改,例如,这只是使用“q”按钮退出,并且模板的路径已被修改,等等。基本上是相同的。在

import cv2
import numpy as np


#set up webcam

cap = cv2.VideoCapture(0)
#cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640)
#cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480)

#read a picture of a hand from my desktop
Hand = cv2.imread('handPic.jpg')
hh,hw, __ = Hand.shape
#convert HSV and calc Histogram of this Pic
hsvHand = cv2.cvtColor(Hand[220:292, 110:220], cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsvHand)
roihist = cv2.calcHist([hsvHand], [0,1], None, [12,12],[0,181,0,256])
#cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)

#while not pressing esc
while cv2.waitKey(30) & 0xFF != ord('q'):

  #take pic convert HSV
  _,frame = cap.read()
  hsvt = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

  #backproject
  dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)


  #filtering

  # ret, dst = cv2.threshold(dst,0,255,cv2.THRESH_OTSU)

  disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
  cv2.filter2D(dst,-1,disc,dst)


  cv2.imshow("Skin Areas", dst)

相关问题 更多 >

    热门问题