ImageMagick 的 Image 和 OpenCV 的 cv::Mat 如何转换
【摘要】
参考自: 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
-
Image Mat2Magick(const cv::Mat& img )
-
{
-
Image mgk(img.cols, img.rows, "BGR", MagickCore::CharPixel, (char *)img.data);
-
return mgk;
-
}
-
-
二、Image -> cv::Mat
-
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);
-
-
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. */
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/71439288
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)