Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv2.imshow显示9个屏幕,而不是1个_Python_Python 3.x_Opencv - Fatal编程技术网

Python cv2.imshow显示9个屏幕,而不是1个

Python cv2.imshow显示9个屏幕,而不是1个,python,python-3.x,opencv,Python,Python 3.x,Opencv,我正在构建一些代码,从网络摄像头视频中自适应检测皮肤。我让它几乎工作,然而,当输出视频时,它显示9个屏幕的“皮肤”面具,而不是只有一个。看起来我只是错过了一些简单的东西,但我想不出来 代码如下: # first let's train the data data, labels = ReadData() classifier = TrainTree(data, labels) # get the webcam. The input is either a video file or the

我正在构建一些代码,从网络摄像头视频中自适应检测皮肤。我让它几乎工作,然而,当输出视频时,它显示9个屏幕的“皮肤”面具,而不是只有一个。看起来我只是错过了一些简单的东西,但我想不出来

代码如下:

# first let's train the data
data, labels = ReadData()
classifier = TrainTree(data, labels)

# get the webcam. The input is either a video file or the camera number
# since using laptop webcam (only 1 cam), input is 0. A 2nd cam would be input 1
camera = cv2.VideoCapture(0)

while True:
    # reads in the current frame
    # .read() returns True if frame read correctly, and False otherwise
    ret, frame = camera.read()   # frame.shape: (480,640,3)

    if ret:
        # reshape the frame to follow format of training data (rows*col, 3)
        data = np.reshape(frame, (frame.shape[0] * frame.shape[1], 3))
        bgr = np.reshape(data, (data.shape[0], 1, 3))
        hsv = cv2.cvtColor(np.uint8(bgr), cv2.COLOR_BGR2HSV)
        # once we have converted to HSV, we reshape back to original shape of (245057,3)
        data = np.reshape(hsv, (hsv.shape[0], 3))
        predictedLabels = classifier.predict(data)

        # the AND operator applies the skinMask to the image
        # predictedLabels consists of 1 (skin) and 2 (non-skin), needs to change to 0 (non-skin) and 255 (skin)
        predictedMask = (-(predictedLabels - 1) + 1) * 255   # predictedMask.shape: (307200,)

        # resize to match frame shape
        imgLabels = np.resize(predictedMask, (frame.shape[0], frame.shape[1], 3))   # imgLabels.shape: (480,640,3)
        # masks require 1 channel, not 3, so change from BGR to GRAYSCALE
        imgLabels = cv2.cvtColor(np.uint8(imgLabels), cv2.COLOR_BGR2GRAY)   # imgLabels.shape: (480,640)

        # do bitwsie AND to pull out skin pixels. All skin pixels are anded with 255 and all others are 0
        skin = cv2.bitwise_and(frame, frame, mask=imgLabels) # skin.shape: (480,640,3)
        # show the skin in the image along with the mask, show images side-by-side
        # **********THE BELOW LINE OUTPUTS 9 screens of the skin mask instead of just 1  ****************
        cv2.imshow("images", np.hstack([frame, skin]))

        # if the 'q' key is pressed, stop the loop
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

# release the video capture
camera.release()
cv2.destroyAllWindows()

您正在使用位图。要了解它们所持有的信息,请分别显示它们。然后你会看到(字面上)数据哪里出错了


现在,罪魁祸首很可能是
np.resize()

np.调整大小(一个新的形状)

返回具有指定形状的新数组

如果新数组大于原始数组,则新数组 中充满了重复的
a
。请注意,此行为是 不同于使用零而不是零填充的.resize(新的_形状) 重复复制
a



要缩放位图(=在努力保持相同视觉图像的同时调整大小),请根据使用位图时使用
cv2.resize()
。要了解它们所持有的信息,请分别显示它们。然后你会看到(字面上)数据哪里出错了


现在,罪魁祸首很可能是
np.resize()

np.调整大小(一个新的形状)

返回具有指定形状的新数组

如果新数组大于原始数组,则新数组 中充满了重复的
a
。请注意,此行为是 不同于使用零而不是零填充的.resize(新的_形状) 重复复制
a



要缩放位图(=在努力保持相同视觉图像的同时调整大小),请根据使用
cv2.resize()

我明白了,但是,我需要调整大小以将predictedMask塑造成一个数组,cvtColor转换为灰度时除外。我不知道如何改变大小线来解决这个问题。@Rachel你读了最后一段了吗?也许公式不清楚。啊,我明白了,我误读了最后一部分。所以我的下一个问题是cv2.resize可以将一维数组调整为二维数组,从而得到一个(行,列)数组。但是,为了将CVT颜色转换为灰度,我需要添加颜色通道来获取(行、列、3),我没有看到使用cv2实现这一点的方法。resize…@Rachel I您有一个255和0的
(307200,)
数组(实际上,一个灰度位图延伸成一条线(我猜)),您只需
np.将其重塑为正常形状
(640480)
。这样,它已经是一个很好的灰度位图了——不需要将它转换成
(640480,3)
,然后再转换回来。灰度位图只有一个通道。我终于解决了这个问题。我认为我的imgLabels数组作为图像数组没有被正确地排除在外。因此,我将二进制数组作为映像写入磁盘,然后作为新数组重新打开映像。然后将这个新变量作为掩码传入。这最终奏效了。很高兴它起作用了,但仍然像是一个黑客。也许一旦我学到更多,我会找到更好的解决办法。谢谢你的帮助!不过,我明白了,我需要调整大小以将predictedMask塑造成一个数组,而cvtColor转换为灰度时除外。我不知道如何改变大小线来解决这个问题。@Rachel你读了最后一段了吗?也许公式不清楚。啊,我明白了,我误读了最后一部分。所以我的下一个问题是cv2.resize可以将一维数组调整为二维数组,从而得到一个(行,列)数组。但是,为了将CVT颜色转换为灰度,我需要添加颜色通道来获取(行、列、3),我没有看到使用cv2实现这一点的方法。resize…@Rachel I您有一个255和0的
(307200,)
数组(实际上,一个灰度位图延伸成一条线(我猜)),您只需
np.将其重塑为正常形状
(640480)
。这样,它已经是一个很好的灰度位图了——不需要将它转换成
(640480,3)
,然后再转换回来。灰度位图只有一个通道。我终于解决了这个问题。我认为我的imgLabels数组作为图像数组没有被正确地排除在外。因此,我将二进制数组作为映像写入磁盘,然后作为新数组重新打开映像。然后将这个新变量作为掩码传入。这最终奏效了。很高兴它起作用了,但仍然像是一个黑客。也许一旦我学到更多,我会找到更好的解决办法。谢谢你的帮助!为什么不打印结果的形状呢?我编辑代码以添加每个变量的形状(见上文)。predictedMask为307200(即rows*cols),调整大小后的imglabel大于307200,则变为(480640,3)。也许这是导致错误的原因?但是,需要使用3的颜色通道将IMGLabel输入cvtColor BGR,使其变为灰色。我尝试将调整大小更改为输出imgLabels为(480640,1),然后将转换注释为灰色,但最终出现以下错误:“错误:(-215)(mtype==CV_8U||mtype==CV_8S)&&&_mask.sameSize(*psrc1)在函数CV::binary_op中”非常感谢您的帮助!我不知道给分级机喂食什么。但是我认为你改变颜色的方法是错误的。程序不完整,所以我无法调试。为什么不打印结果的形状?我编辑代码以添加每个变量的形状(见上文)。predictedMask为307200(即rows*cols),调整大小后的imglabel大于307200,则变为(480640,3)。也许这是导致错误的原因?但是,需要使用3的颜色通道将IMGLabel输入cvtColor BGR,使其变为灰色。我尝试将调整大小更改为将imglabel输出为(480640,1),然后将转换注释为灰色,但最终出现以下错误:“error:(-215)(mtype==CV_8U | | mtype==C