2016-12-26 12 views
1

逆投影を使用して、人物のヒストグラムを知っている人物を画像内に配置します。問題は、それが肌やきれいな服の上で働いていないということです。ここでOpenCv RGBヒストグラム逆投影が期待どおりに機能しない

Back-projection resultは、私が関心領域のBGRヒストグラムを計算するために使用するコードです::ここに は私が得るものです

channels=[0,1,2] 
histSize = [8,8,8] 
ranges=[0,256, 0,256, 0,256] 

#image is in BGR color 
bgr_split = cv2.split(roi_img) 

#Compute image bgr histogram 
hist = cv2.calcHist(bgr_split, channels, mask, histSize, ranges) 
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX) 

I私が手にヒストグラムが人の色と一貫性ですが、その人物を含む画像に逆投影を適用すると、人の暗い領域のみがBack-projection resultに示すように非ゼロ値を得る。

ヒストグラムの逆投影を1つのピクセルでテストしましたが、私はその結果を理解していません。私はこれを取得:

>> hist[2,2,1] 
83.539368 
>> pix_img = np.uint8(np.array([[[66,66,34]]])) 
>> cv2.calcBackProject([pix_img],channels,hist,ranges,1) 
array([[0]], dtype=uint8) 

ピクセル(B = 66、G = 66、R = 34)HISTSIZE = [8,8,8]以来[2,2,1]ヒストグラムビンに対応している必要があり、それでも、逆投影は141の代わりに0を返します。

私が間違っていることは何ですか?

答えて

0

いくつかのテストの後、それは画素[B、V、R]に適用される逆投影関数のように見えるが、画素に逆投影与える[B、V、0]、第三のチャネルの値は無視されます。 opencvのバグだと思いますが、私はそれを報告するつもりです。

私は、この機能を使用するとことで、それを交換しないで問題をバイパス:

b,g,r=cv2.split(img/(256/ql)) 
B = np.uint8(hist[b.ravel(),g.ravel(), r.ravel()]) 
B = B.reshape(img.shape[:2]) 
ret, B = cv2.threshold(B,10,255,cv2.THRESH_BINARY) 
関連する問題