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

仅以 BGR 格式为例:
一、cv::Mat -> Image

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


二、Image -> cv::Mat

bool copyImageToMat(Magick::Image & im_image, cv::Mat & cv_image)
{
    // Get size of image.
    size_t
        w = im_image.columns(),
        h = im_image.rows();

    // Allocate enough bytes for image data.
    unsigned char blob[w * h * 3];

    // Write image data to blob.
    im_image.write(0, 0, w, h, "BGR", Magick::CharPixel, &blob);

    // Construct new Mat image.
    cv::Mat cv_temp((int)h, (int)w, CV_8UC3, blob);

    // Was any work done?
    bool dataWasCopied = !cv_temp.empty();
    if (dataWasCopied) {
        // Copy data to destination.
        cv_image = cv_temp.clone();
    }
    return dataWasCopied;
}

 

   

 void Magick2Mat(Image& magicImage, cv::Mat& img)  
    {  
       int width= magicImage.size().width();  
       int height = magicImage.size().height();  
       int size = 3 * width * height;
     
       uchar* blob= new uchar[size];  
       magicImage.write(0,0, width, height, "BGR", MagickCore::CharPixel, blob);  
     
       img.create(height, width, CV_8UC3);
       memcpy(img.data, blob, size);  
     
       delete [] blob;  
    } 


三、其他格式

ImageMagick 支持的其他存储格式

    typedef enum
    {
      UndefinedPixel,
      CharPixel,
      DoublePixel,
      FloatPixel,
      LongPixel,
      LongLongPixel,
      QuantumPixel,
      ShortPixel
    } StorageType;


OpenCV 支持的格式

    #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
    #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
    #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
    #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
    #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
     
    #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
    #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
    #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
    #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
    #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
     
    #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
    #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
    #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
    #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
    #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
     
    #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
    #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
    #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
    #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
    #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
     
    #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
    #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
    #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
    #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
    #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
     
    #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
    #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
    #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
    #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
    #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
     
    #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
    #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
    #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
    #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
    #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))


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


四、如何使用

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


1) Image -> Mat

    cv::Mat img;
    Magick2Mat(image, img);
    cv::imshow("Magick2Mat", img);
    cv::waitKey(0);
     


2) Mat -> Image

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

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

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

可以是以下的任意组合:

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值