C++ Magick++;转换为Mat Opencv时出现问题
大家好, 我有这个问题,我需要将Magick++图像转换为OpenCV Mat。虽然我成功地将其转换,但出现了垫子颜色不正确的问题(请参见附图)。在我的例子中,我有一个PDF文件,我将其逐页转换为Magick++图像,要使用我的图像处理方法,我需要将其转换为OpenCV Mat。当我使用其他PDF文件时,颜色是正确的。我非常感谢在这个问题上的任何帮助,谢谢。 我的工作代码显示在下面,谢谢。 注:我使用ImageMagick-7.0.6-Q16和OpenCV 2.4.11C++ Magick++;转换为Mat Opencv时出现问题,c++,opencv,image-processing,imagemagick-convert,magick++,C++,Opencv,Image Processing,Imagemagick Convert,Magick++,大家好, 我有这个问题,我需要将Magick++图像转换为OpenCV Mat。虽然我成功地将其转换,但出现了垫子颜色不正确的问题(请参见附图)。在我的例子中,我有一个PDF文件,我将其逐页转换为Magick++图像,要使用我的图像处理方法,我需要将其转换为OpenCV Mat。当我使用其他PDF文件时,颜色是正确的。我非常感谢在这个问题上的任何帮助,谢谢。 我的工作代码显示在下面,谢谢。 注:我使用ImageMagick-7.0.6-Q16和OpenCV 2.4.11 try { st
try {
string fName = "";
vector<Magick::Image> imageList;
cout << "Please Input the File name of the PDF." << endl;
cin >> fName;
cout << "Please wait while converting the PDF to Images...." << endl;
readImages(&imageList, fName);
bool isDecoded = false;
for (int i = 0; i < imageList.size(); i++){
if (!isDecoded){
int w = imageList[i].columns();
int h = imageList[i].rows();
Mat opencvImage(h,w,CV_8UC4);
imageList[i].write(0, 0, w, h, "RGBA" , Magick::CharPixel, opencvImage.data);
string decoded = QRScanner(opencvImage);
imshow("opencvImage", opencvImage);
if (decoded != ""){
cout << "Result: " << decoded << endl;
isDecoded = true;
}
waitKey();
}
}
}
catch (Magick::Exception &error_)
{
cout << "Caught exception: " << error_.what() << endl;
}
cout << "Convert Complete!" << endl;
system("pause");
试试看{
字符串fName=“”;
向量图像列表;
cout fName;
cout我认为上面的评论已经解决了大部分问题,但我相信可以通过调整通道图使其符合OpenCV的预期来快速解决这个问题
imageList[i]。写入(0,0,w,h,“BGRA”,Magick::CharPixel,opencvImage.data);
^^^^
无需担心cvtColor
或否定,因为您已经可以控制数据流的导出方式。您似乎没有附加图像。此外,请发布代码的最小工作示例。请实际发布代码。在堆栈溢出时,您可以通过将整个代码块缩进至少t四个空格并插入到您的帖子中。人们可以更容易地一起阅读代码和问题陈述,也可以让其他人复制/粘贴您的代码(如果他们想运行代码)。帮助他人帮助:)。任何一种方式都可能是通道的顺序有问题吗?大多数库将图像作为RGB读取,但是OpenCV使用的是BGR顺序。您可以使用OpenCV中的cvtColor()
。@AlexanderReynolds谢谢:)我是新手。@AlexanderReynolds我尝试了OpenCV的cvtColor,但颜色仍然不在正确的位置。包含QRCode的背景仍然是黑色的。谢谢B您是谁使用的cvtColor()
?我很确定您是以R、G、B顺序而不是B、G、R顺序编写频道,因此cvtColor(图像、图像、cv::COLOR_RGBA2BGRA)
在显示之前应该可以工作。