ImageMagick 的 Image 和 OpenCV 的 cv::Mat 如何转换

举报
ShaderJoy 发表于 2021/12/30 00:06:03 2021/12/30
【摘要】 参考自: http://blog.csdn.net/revolver/article/details/12851395 仅以 BGR 格式为例: 一、cv::Mat -> Image Image Mat2Magick(const cv::Mat& img ) { Image mgk(img.cols...

参考自: http://blog.csdn.net/revolver/article/details/12851395


仅以 BGR 格式为例:

一、cv::Mat -> Image


  
  1. Image Mat2Magick(const cv::Mat& img )
  2. {
  3. Image mgk(img.cols, img.rows, "BGR", MagickCore::CharPixel, (char *)img.data);
  4. return mgk;
  5. }

二、Image -> cv::Mat


  
  1. void Magick2Mat(Image& magicImage, cv::Mat& img)
  2. {
  3. int width= magicImage.size().width();
  4. int height = magicImage.size().height();
  5. int size = 3 * width * height;
  6. uchar* blob= new uchar[size];
  7. magicImage.write(0,0, width, height, "BGR", MagickCore::CharPixel, blob);
  8. img.create(height, width, CV_8UC3);
  9. memcpy(img.data, blob, size);
  10. delete [] blob;
  11. }


三、其他格式

ImageMagick 支持的其他存储格式


  
  1. typedef enum
  2. {
  3. UndefinedPixel,
  4. CharPixel,
  5. DoublePixel,
  6. FloatPixel,
  7. LongPixel,
  8. LongLongPixel,
  9. QuantumPixel,
  10. ShortPixel
  11. } StorageType;

OpenCV 支持的格式


  
  1. #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
  2. #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
  3. #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
  4. #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
  5. #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
  6. #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
  7. #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
  8. #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
  9. #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
  10. #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
  11. #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
  12. #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
  13. #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
  14. #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
  15. #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
  16. #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
  17. #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
  18. #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
  19. #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
  20. #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
  21. #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
  22. #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
  23. #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
  24. #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
  25. #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
  26. #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
  27. #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
  28. #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
  29. #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
  30. #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
  31. #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
  32. #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
  33. #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
  34. #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
  35. #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))


比如 Image 为 单通道的FloatPixel,那么 cv::Mat 就应该改为 CV_32FC1 与之对应。


四、如何使用

使用方法也十分简单,直接上代码


1) Image -> Mat


  
  1. cv::Mat img;
  2. Magick2Mat(image, img);
  3. cv::imshow("Magick2Mat", img);
  4. cv::waitKey(0);


  
  1. Image test = Mat2Magick(img);
  2. test.write("Mat2Magick.jpg");


PS: 通过查看 ImageMagick 源码(Pixel.c)

ImportImagePixels() 【由 image.cpp 的 ConstituteImage 调用】 里面定义了颜色映射的字符串含义

可以是以下的任意组合:


  
  1. / * R = red, G = green, B = blue,
  2. % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
  3. % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
  4. % P = pad. */




文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/71439288

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。