python - 在Numpy和OpenCV2中替换3D子矩阵

标签 python numpy opencv

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/

相关文章:

python - 我可以将 DateTimeFields 与标签 "if"进行比较吗?

python - “NoneType”对象没有属性 'fillna'错误

python - 如何修复python中opencv中的错误 "QObject::moveToThread:"?

python - 如何检测多个附加图像并将其剪掉?

c++ - opencv中的Vec3b和Scalar有什么区别?

python - 如何离线在Anaconda3中安装OpenCV3?

python - django 模板包括

python - 有没有一种有效的方法可以在大型 pandas 数据框中选择多行?

python - 将数据集拆分为两个非冗余的 numpy 数组?

python - 正切 x 的反正切未精确计算