Replace sub part of matrix by another small matrix in numpy似乎通常是为了我的目的而工作,但我遇到了一些我无法调和的东西。考虑下面的代码,它创建了两个三维矩阵-- OpenCV2摄像头输入的形状(在我的例子中是(480,640,3)),一个是1s (frame)和一个随机浮动(rgb_noise_mask),它用相同的rgb_noise_mask子矩阵替换frame中指定的子矩阵,并将其显示到屏幕上。此代码按预期工作,在白色字段上显示一个基于RGB的静态块。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
frame = np.ones(frame.shape)
rgb_noise_mask = np.random.random(size=frame.shape)
while True:
boxes = [[300,300,30,30]]
for box in boxes:
x, y, width, height = box
frame[y:y2, x:x2] = rgb_noise_mask[y:y2, x:x2]
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()现在脱下训练轮,使用实际的网络摄像头输入,而不是伪造它。该框现在显示为统一的黑色,而不是预期的颜色:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
rgb_noise_mask = np.random.random(size=frame.shape)
while True:
ret, frame = cap.read()
boxes = [[300,300,30,30]]
for box in boxes:
x, y, width, height = box
frame[y:y2, x:x2] = rgb_noise_mask[y:y2, x:x2]
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()为什么会这样,我怎么才能绕过它呢?更让我困惑的是,如果我在第二个代码示例中将frame[y:y2, x:x2] = rgb_noise_mask[y:y2, x:x2]替换为frame[y:y2, x:x2] = frame[y:y2, x:x2][::-1],那么它的行为就像预期的那样,并以镜像的平方显示实时输出。
发布于 2020-08-10 21:09:11
这里的问题是,ret, frame = cap.read()将frame作为带有dtype=np.uint8的numpy数组返回,而rgb_noise_mask则在0,1之间浮动,因此当转换为uint8时,所有0都是浮动的。
一个简单的解决方法是用randint作为整数生成噪声。
rgb_noise_mask = np.random.randint(0,256, size=frame.shape, dtype=np.uint8)https://stackoverflow.com/questions/63347912
复制相似问题