【发布时间】:2020-08-10 20:56:10
【问题描述】:
Replace sub part of matrix by another small matrix in numpy 通常似乎适合我的目的,但我遇到了一些我无法调和的事情。考虑下面的代码,它创建了两个 3D 矩阵,形状为 OpenCV2 网络摄像头输入(在我的例子中是 (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],它的行为与预期一样,并显示具有该正方形镜像的实时输出。
【问题讨论】: