c++ - OpenCV => ImageMagick cv::Mat 到 Magick::Image CV_UC3
问题描述
我想使用 ImageMagick 来编写多帧 tiff。我按照这个来写一个“TiffWriter”: Tiffwriter topic
我尝试使用此主题将 cv::Mat 转换为 Magick::Image: cv::Mat => Magick::Image
我在第二部分面临一个问题:
我更改了 TiffWritter 以便像这样从 OpenCV 矩阵写入 RGBImage:
TiffWriter::TiffWriter(std::string filename) : filename(filename) {}
// for example for a 8 bit gray image buffer
void TiffWriter::writeGray(const unsigned char* buffer, int width, int height)
{
Magick::Blob gray8Blob(buffer, width * height);
Magick::Geometry size(width, height);
Magick::Image gray8Image(gray8Blob, size, 8, "GRAY");
imageList.push_back(gray8Image);
}
void TiffWriter::writeRGB(Mat& mat)
{
auto depth = mat.depth();
auto channels = mat.channels();
auto type = mat.type();
Magick::Image Mg_RGB(mat.cols,mat.rows,"BGR",Magick::CharPixel,(char *)mat.data);
imageList.push_back(Mg_RGB);
}
TiffWriter::~TiffWriter()
{
Magick::writeImages(imageList.begin(), imageList.end(), filename);
}
我试着检查深度、频道和类型,正如你在间谍中看到的那样,一切似乎都很好,然后我对可能是什么问题有点不知道。
就在我成功在窗口中显示完全相同的图像之前。
for (int i = 16; i < shg.count(); i += 2)
{
cout << "\n Image " << i << "\n";
start = chrono::system_clock::now();
Mat im = shg.GetSubImage(i);
MaskRCNN.ProcessImage(im);
// This work !
cv::imshow("Display window", im);
cv::waitKey(500);
end = std::chrono::system_clock::now();
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end - start).count();
cout << "elapsed time: " << elapsed_seconds << "s\n";
}
cvvDestroyWindow("Display window");
// Issue here
shg.Save(Dest_File);
封装图像的对象中的方法是这样的:
bool ImageContainer::Save(cv::String Filepath)
{
try
{
TiffWriter MyTiffWriter(Filepath);
for (int i = 0; i < count(); i++)
{
Mat Im = GetSubImage(i);
MyTiffWriter.writeRGB(Im);
}
cout << Filepath + " Enregistré...\n";
return true;
}
catch (Exception e)
{
cout << e.msg;
return false;
}
}
有人有想法吗?
谢谢 !
错误消息详细信息:
Exception non gérée à 0x00007FFAE241A388 dans Program.exe : exception
Microsoft C++ : Magick::ErrorOption à l'emplacement de mémoire
0x0000003DED95E150.
如果我单击“继续”,我会收到以下消息:
Exception levée à 0x0000000000000000 dans Program.exe : 0xC0000005 :
Violation d'accès lors de l'exécution à l'emplacement
0x0000000000000000.Exception levée à 0x0000000000000000 dans Program.exe :
0xC0000005 : Violation d'accès lors de l'exécution à l'emplacement
0x0000000000000000.
编辑:我处理了这样的异常:
void TiffWriter::writeRGB(Mat& mat)
{
try
{
auto depth = mat.depth();
auto channels = mat.channels();
auto type = mat.type();
Magick::Image Mg_RGB(mat.cols, mat.rows, "BGR", Magick::CharPixel, (char *)mat.data);
imageList.push_back(Mg_RGB);
}
catch (Magick::Error &error)
{
// Process Magick++ file open error
cerr << "Error: " << error.what() << endl;
// Try next image.
}
}
消息是这样的:
Error: Magick: unrecognized pixel map ``QSõ▒' @ error/pixel.c/ImportImagePixels/4243
如果我将导致问题的行替换为:
Magick::Image Mg_RGB(2, 2, "RGB", Magick::CharPixel, (char*)"2222");
我得到完全相同的问题。
我尝试检查“ ImageMagick/pixel.c ”文件:当我观看“pixel.c”第 4243 行的代码时,有一个开关盒:
switch (map[i])
{
case 'a':
case 'A':
{
quantum_map[i]=AlphaQuantum;
image->alpha_trait=BlendPixelTrait;
break;
}
case 'B':
case 'b':
{
quantum_map[i]=BlueQuantum;
break;
}
...
default:
{
quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
(void) ThrowMagickException(exception,GetMagickModule(),OptionError,
"UnrecognizedPixelMap","`%s'",map);
return(MagickFalse);
}
}
那么就好像我进入了这个“开关/案例”的“默认”部分,可能是“RGB”字符的问题?
解决方案
推荐阅读
- apache - 在中使用 RedirectMatch
我需要用我的 apache 服务器将一些肥皂请求重定向到另一台服务器。我在我的 .conf 中使用不同,因为我必须管理更多场景。
对于一种情况,我需要从传入的 url 中截取参数以将其重定向到第二个 url。
我用这个:
<Location /WelcomePage> SetHandler weblogic-handler
- java - 文件的冒泡排序行(Java)
- oracle - oracle创建视图的方法
- laravel-8 - 在laravel 8上发送电子邮件时找不到用户
- amazon-ec2 - 为什么即使在设置了所有必需的配置之后,Superset 警报邮件也不起作用?
- sql - 一张表格有多合适
- firebase - 了解如何在火力基地上传图片
- flutter - 我在颤振中使用了titled_navigation_bar,但是当我在其中设置动态页面时不起作用
- attributeerror - AttributeError:模块'discord'没有属性'embed'我需要做什么
- flutter - 不能将抽象类的子类型作为参数传递给函数