Replace sub part of matrix by another small matrix in numpy通常似乎可以达到我的目的,但是我遇到了无法解决的问题。考虑以下代码,该代码创建两个OpenCV2网络摄像头输入形状的3D矩阵(在我的情况下为(480,640,3)),全1(frame
)之一和随机浮点(rgb_noise_mask
)之一,替换指定的子矩阵在frame
中具有与rgb_noise_mask
相同的子矩阵,并将其显示在屏幕上。该代码按预期工作,在白色场上显示了一个基于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]
,它的行为将与预期的一样,并以镜像的正方形显示实时输出。
最佳答案
这里的问题是ret, frame = cap.read()
将frame
作为带有dtype=np.uint8
的numpy数组返回,而rgb_noise_mask
则在0,1
之间 float ,因此所有0
在转换为uint8
时都是如此。
一个简单的解决方法是使用randint
将噪声生成为整数:
rgb_noise_mask = np.random.randint(0,256, size=frame.shape, dtype=np.uint8)
关于python - 在Numpy和OpenCV2中替换3D子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63347912/