ZED Mat_Type的相关问题 mat转换后无法直接使用

今天想用zed来拍取照片然后整成一个照片。但是怎么都无法把照片写入到视频中,我就纳闷了,用普通的电脑自带的摄像头是可以存取视频的,怎么换成zed拍的照片就不行了。明明存视频的过程就是简单的把照片合在一起呀。
然后我在这里发现了突破点
bool isColor = (src.type() == CV_8UC3);
这是一个判断图片类型是否是8UC3型的。
后面的
writer.open(filename, codec, fps, src.size(), isColor)
就是根据这个bool型来判断是灰色图片还是彩色图片。
我用自带的摄像机拍到的照片这里返回的是1,而用zed拍的照片经过zed转opencv格式后在这里返回的是0。不应该啊,明明我
writer.open(filename, codec, fps, src.size(), isColor);
sl Mat里面定的也是三通道的。
然后我去那个转换函数那论证。
cv::Mat slMat2cvMat(sl::Mat& input)
{
// Mapping between MAT_TYPE and CV_TYPE
int cv_type = -1;
switch (input.getDataType()) {
case sl::MAT_TYPE::F32_C1: cv_type = CV_32FC1; cout<<1<<endl;break;
case sl::MAT_TYPE::F32_C2: cv_type = CV_32FC2; cout<<2<<endl;break;
case sl::MAT_TYPE::F32_C3: cv_type = CV_32FC3;cout<<3<<endl; break;
case sl::MAT_TYPE::F32_C4: cv_type = CV_32FC4;cout<<4<<endl; break;
case sl::MAT_TYPE::U8_C1: cv_type = CV_8UC1;cout<<5<<endl; break;
case sl::MAT_TYPE::U8_C2: cv_type = CV_8UC2; cout<<6<<endl;break;
case sl::MAT_TYPE::U8_C3: cv_type = CV_8UC3;cout<<7<<endl; break;
case sl::MAT_TYPE::U8_C4: cv_type = CV_8UC4; cout<<8<<endl;break;
default: break;
}

}

结果就是一直输出8。。。。明明我sl Mat定的是U8_C3,后来我发现不管我怎么改U8几通道,都会进这个case。
然后想到上次跑图像识别的模型,照片也不能直接放进去跑。最后退而求其次通过存取照片文件,再读取照片文件的方式成功通过。
现在仔细一想,imwrite 再imread的过程其实就是一个四通道变成了三通道的过程。
我又在现在存视频的地方试了,果然,这下子可以存视频了。

总而言之,问题就出在zed 的sdk,不管你怎么设置通道数,它其实是写死的4通道。这就很坑。
当然4通道转3通道,存取再读取的方式不太保险,建议直接使用cv::cvt(src,src,1)
这里的1代表

COLOR_BGRA2BGR     = 1

顺便 解决了之前困扰我的问题。

以下是使用ZED相机进行物体识别的示例代码(使用OpenCVZED SDK): ```python import cv2 import numpy as np import pyzed.sl as sl # 初始化ZED相机 zed = sl.Camera() init_params = sl.InitParameters() init_params.camera_resolution = sl.RESOLUTION.HD720 # 设置相机分辨率 init_params.camera_fps = 30 # 设置相机帧率 err = zed.open(init_params) if err != sl.ERROR_CODE.SUCCESS: print("相机打开失败") zed.close() exit() # 设置对象检测器 net = cv2.dnn.readNetFromDarknet("yolov4.cfg", "yolov4.weights") # 加载YOLOv4模型 net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) # 设置CUDA后端 net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) # 设置CUDA目标 # 获取相机参数 camera_params = zed.get_camera_information().calibration_parameters.left_cam # 创建Mat对象以存储图像 image_size = (camera_params.width, camera_params.height) image_zed = sl.Mat(image_size[1], image_size[0], sl.MAT_TYPE.U8_C4) # 创建窗口 cv2.namedWindow("ZED", cv2.WINDOW_NORMAL) # 循环读取图像并进行物体检测 while True: if zed.grab() == sl.ERROR_CODE.SUCCESS: # 从相机中获取图像 zed.retrieve_image(image_zed, sl.VIEW.LEFT) # 将图像转换OpenCV格式 image_ocv = image_zed.get_data() # 运行物体检测器 blob = cv2.dnn.blobFromImage(image_ocv, 1 / 255.0, (416, 416), swapRB=True, crop=False) net.setInput(blob) layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] outputs = net.forward(output_layers) # 解析输出并绘制边界框 class_ids = [] confidences = [] boxes = [] for output in outputs: for detection in output: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * image_size[0]) center_y = int(detection[1] * image_size[1]) width = int(detection[2] * image_size[0]) height = int(detection[3] * image_size[1]) left = int(center_x - width / 2) top = int(center_y - height / 2) class_ids.append(class_id) confidences.append(float(confidence)) boxes.append([left, top, width, height]) indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) for i in indices: i = i[0] box = boxes[i] left = box[0] top = box[1] width = box[2] height = box[3] label = str(class_ids[i]) cv2.rectangle(image_ocv, (left, top), (left + width, top + height), (0, 255, 0), 2) cv2.putText(image_ocv, label, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) # 显示图像 cv2.imshow("ZED", image_ocv) # 检查是否退出 key = cv2.waitKey(1) if key & 0xFF == ord('q'): break # 关闭窗口和相机 cv2.destroyAllWindows() zed.close() ``` 这个示例代码使用YOLOv4模型进行物体检测,并且使用ZED SDK将图像相机中读取到OpenCV中进行处理。请注意,这只是一个示例,你需要根据你的需求对代码进行适当的修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值