今天想用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
顺便 解决了之前困扰我的问题。