如何解决在Numpy和OpenCV2中替换3D子矩阵
Replace sub part of matrix by another small matrix in numpy通常似乎可以达到我的目的,但是我遇到了无法解决的问题。考虑以下代码,该代码创建两个3D矩阵,形式为OpenCV2网络摄像头输入(在我的情况下为(480,640,3)),所有1之一(fn add_employee(h: &mut HashMap<&str,Vec<String>>) {
println!("Choose a department:");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
if let Some(value) = h.get_mut(input.as_str()) {
println!("Enter a name to add to this department:");
let mut name = String::new();
io::stdin()
.read_line(&mut name)
.expect("Failed to read line");
value.push(name);
}
}
),其中一个随机浮点数({{1 }}),将frame
中的指定子矩阵替换为rgb_noise_mask
的相同子矩阵,并将其显示在屏幕上。该代码按预期工作,在白色区域上显示了一个基于RGB的静态块。
frame
现在,请取下辅助轮,并使用实际的网络摄像头输入来代替伪装。现在,同一框显示为统一的黑色,而不是预期的颜色:
rgb_noise_mask
为什么会这样,我该如何解决?令我更加困惑的是,如果我在第二个代码示例中将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,frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
,它的行为将与预期的一样,并显示实时输出并镜像该正方形。
解决方法
这里的问题是ret,frame = cap.read()
返回frame
作为带有dtype=np.uint8
的numpy数组,而rgb_noise_mask
浮在0,1
之间,因此所有{{1 }}转换为0
时。
一个简单的解决方法是使用uint8
将噪声生成为整数:
randint
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。