我的目标是从numpy数组创建一个前景蒙版,它将浮点数作为元素。每个mtrix都已通过SVD处理,大部分背景已被删除。值范围为-146到171,pyplot.imshow函数可以显示图像。但是openCV不能接受numpy数组作为输入。我已经搜索并尝试了许多函数来从PIL和OpenCV中的图像转换数组,但都失败了。
>> import numpy as np
>> from matplotlib import pyplot as plt
>> import cv2
>> people_frames.shape
(120, 160, 1499)
>> people_frames.dtype
dtype('float64')
>> test=people_frames[:,:,473]
>> np.amax(test),np.amin(test)
(171.04012891092754, -146.60759656055131)
>> plt.imshow(test,cmap='gray')
上面的交互结果很顺利,测试确实是一个numpy数组。 以下代码给出了错误消息:
mask = np.zeros(test.shape,np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (0,0,119,159)
cv2.grabCut(test,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1)
错误信息是:
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-104-1ca3406e3367> in <module>()
5
6 rect = (0,0,119,159)
----> 7 cv2.grabCut(test,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
8 mask2 = np.where((mask==2)|(mask==0),0,1)
error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\grabcut.cpp:543: error: (-5) image must have CV_8UC3 type in function cv::grabCut
我不确定grabCut是否适用于灰度图像。所以我在OpenCV中尝试了自适应阈值,但它仍然不能接受测试作为参数。
cv.adaptiveThreshold(test,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,2)
但我仍然收到错误消息
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-109-bc6d6ef4108c> in <module>()
----> 1 cv2.adaptiveThreshold(test,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\thresh.cpp:1520: error: (-215) src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function cv::adaptiveThreshold
我真的不知道如何获得前景蒙版。我不是坚持使用openCV模块,但似乎最有帮助。欢迎任何其他方法。