我试图通过Magick ++将从GIF加载的图像转换为cv::Mat
.我已经转换cv::Mat
为Magick::Image
但似乎无法找到如何从Magick中的Image中提取数据以将其加载到Mat中.最好的方法是什么?
作为参考,反过来:将cv :: Mat转换为Magick :: Image
更新的答案
我认为这是我能得到的最好的!
#include#include #include using namespace std; using namespace Magick; using namespace cv; int main(int argc,char **argv) { // Initialise ImageMagick library InitializeMagick(*argv); // Create Magick++ Image object and read image file Image image("image.gif"); // Get dimensions of Magick++ Image int w=image.columns(); int h=image.rows(); // Make OpenCV Mat of same size with 8-bit and 3 channels Mat opencvImage(h,w,CV_8UC3); // Unpack Magick++ pixels into OpenCV Mat structure image.write(0,0,w,h,"BGR",Magick::CharPixel,opencvImage.data); // Save opencvImage imwrite("result.png",opencvImage); }
对于我自己将来的参考,括号中的其他Magick ++ StorageTypes和我假设的OpenCV等价物是:
Magick :: CharPixel(CV_8UC3)
Magick :: ShortPixel(CV_16UC3)
Magick :: IntegerPixel(CV_32SC3)
Magick :: FloatPixel(CV_32FC3)
Magick :: DoublePixel(CV_64FC3)
上一个答案
这是一项正在进行中的工作 - 它有效但可能不是最佳的,因为我仍在学习自己.
#include#include #include using namespace std; using namespace Magick; using namespace cv; int main(int argc,char **argv) { // Initialise ImageMagick library InitializeMagick(*argv); // Create Magick++ Image object and read image file Image image("image.gif"); // Get pointer to the Magick++ pixel data in OpenCV "BGR" format Magick::PixelData pData(image,"BGR",Magick::CharPixel); // Get dimensions of the Magick++ image int w=image.columns(); int h=image.rows(); // Make OpenCV Mat of same size with 8-bit and 3 channels Mat opencvImage(h,w,CV_8UC3); // Copy Magick++ data into OpenCV Mat std::memcpy(opencvImage.data,pData.data(),w*h*3); // Save opencvImage imwrite("result.png",opencvImage); }
实际上,Magick ++能够将像素缓冲区写入你已经分配的一些内存中,如果我们Mat
尽快宣布,我们可以这样做.
它看起来像这样:
image.write(const ssize_t x_, const ssize_t y_, const size_t columns_, const size_t rows_, const std::string &map_, const StorageType type_, void *pixels_)
目前,我们至少暂时使用双内存,因为我们将像素数据从Magick ++复制到缓冲区并从缓冲区复制到Mat
,所以我们应该做这样的事情(尚未测试):
// Create Magick++ Image object and read image file Image image("image.gif"); // Get dimensions of the Magick++ image int w=image.columns(); int h=image.rows(); // Make OpenCV Mat of same size with 8-bit and 3 channels Mat opencvImage(h,w,CV_8UC3); // Write the Magick++ image data into the Mat structure image.write(const ssize_t x_, # testing this param const ssize_t y_, # testing this param const size_t columns_, # testing this param const size_t rows_, # testing this param const std::string &map_, # testing this param Magick::CharPixel, opencvImage.data);