2017-10-10 97 views
0

我有一个应用程序,需要pangolin::Image格式rgbd图像。我想发送一个cv::Mat。如何将cv :: Mat转换为穿山甲::图像?将cv :: Mat转换为穿山甲::图片?

(穿山甲:https://github.com/stevenlovegrove/Pangolin

图片标头:

https://github.com/stevenlovegrove/Pangolin/blob/master/include/pangolin/image/image.h

目前格式是:

pangolin::ManagedImage<unsigned short> firstData(640, 480); 

    pangolin::Image<unsigned short> firstRaw(firstData.w, firstData.h, firstData.pitch, (unsigned short*)firstData.ptr); 

其中firstRaw然后通过应用程序发送。

如果我现在有:

cv::Mat frame = cv::imread(filepath,0);

什么是framefirstRaw转换?

我开始是这样的:

int loadDepthFromMat(cv::Mat filepath, pangolin::Image<unsigned short> & depth) 
{ 
    int width = filepath.cols; 
    int height = filepath.rows; 

    pangolin::ManagedImage<unsigned short> depthRaw(width, height); 

    pangolin::Image<unsigned short> depthRaw16((unsigned short*)depthRaw.ptr, depthRaw.w, depthRaw.h, depthRaw.w * sizeof(unsigned short)); 


//copy data 

} 

谢谢。

+2

假设穿山甲::图像在主机/ cpu内存上,在确认穿山甲图像已被分配后,在数据指针上使用memcpy()。只要确保首先将OpenCV图像转换为无符号短格式。 –

+0

感谢您的回复。如果你有时间,请给我一个例子吗? – anti

回答

2

所以,假设你已经用正确的音高(或通道,在OpenCV中)将你的cv :: Mat转换为无符号的短格式,那么你只需使用memcpy。

(我已经改名为你的简历::垫从文件路径来垫(为什么叫文件路径)):

memcpy((void*)depthRaw16.begin(), (void*)mat.data, mat.total() * mat.elemSize()); 

再次,确保您穿山甲图像具有相同的尺寸,并肯定 cv :: Mat被转换为unsigned short。

+0

谢谢!所以只要我设置了'Image':int width = mat.cols; \t int height = mat.rows; \t穿山甲:: ManagedImage depthRaw(width,height);',我应该没事?现在我只需要找到UShort转换...再次感谢 – anti

+0

..添加'int channels = mat.channels();'和'pangolin :: Image firstRaw(width,height,channels,(unsigned short *)firstData.ptr);' – anti

+2

你会想要cv :: Mat :: convertTo。所以实例化一个新的cv :: Mat(例如mat_ushort),并且执行mat.convertTo(mat_ushort,CV_16UC1); (用于灰度)或mat.convertTo(mat_ushort,CV_16UC3); (对于RGB)或CV_16UC4(如果您有RGBA)。然后使用新的cv :: Mat进行memcpy操作。使用convertTo将设置channels()属性,手动设置它将不会执行任何操作。 –