OpenCV => ImageMagick cv :: Mat to Magick :: Изображение CV_UC3 - PullRequest
0 голосов
/ 16 января 2019

Я хочу использовать ImageMagick для записи мультикадра TIFF. Я последовал за этим, чтобы написать «TiffWriter»: Тема Tiffwriter

Я попытался преобразовать cv :: Mat в Magick :: Image, используя эту тему: cv :: Mat => Magick :: Image

У меня проблема со второй частью:

Я изменил TiffWritter для записи RGBImage из OpenCV Matrix следующим образом:

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);
}

Во время выполнения я сталкиваюсь с такой ошибкой: Debug

Я попытался проверить Глубину, каналы и тип, как вы можете видеть в шпионе, и все кажется хорошим, тогда я немного разбираюсь в том, в чем может быть проблема.

Непосредственно перед тем, как мне удалось отобразить точно такое же изображение в окне.

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 ": Когда я смотрю код строки 4243 "pixel.c", появляется случай переключения:

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»?

...