Не могу получить закодированное изображение из cv :: imencode (получаю беспорядок).Как исправить испорченное сохранение .jpg? - PullRequest
4 голосов
/ 16 ноября 2011

Поэтому я пытаюсь сохранить изображение в ostream через cv::imencode apis .Из imencode мы получаем вектор.Как показано здесь , оно может быть сохранено в любом ostream.Например std::ofstream.Но это не удаляет данные = (

Это то, что мы видим:

enter image description here

Вот что мы получаем в файле:

enter image description here

А вот и наш код:

#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <ctime>
#include <iterator>

#include <opencv2/opencv.hpp>



void send_data(std::ostream & o, const std::vector<uchar> & v)
{
    o.write(reinterpret_cast<const char*>(v.data()), v.size());
}

int main(  )
{
    int w=400, h=400;
    cv::Mat black = cv::Mat::zeros(cv::Size(w, h), CV_8UC3);

    {
        for(int i = 0; i <= 35; ++i)
        {
            for (int k = 0; k <=35; ++k)
            {
                black.row(i).col(k) = 255;
            }
        }

        for(int i = 10; i <= 15; ++i)
        {
            for (int k = 10; k <=15; ++k)
            {
                black.row(i).col(k) = 0;
            }
        }

        for(int i = 25; i <= 30; ++i)
        {
            for (int k = 25; k <=30; ++k)
            {
                black.row(i).col(k) = 0;
            }
        }

        for(int i = 25; i <= 75; ++i)
        {
            for (int k = 25; k <= 75; ++k)
            {
                black.row(i).col(k) = 255;
            }
        }

        for(int i = 35; i <= 65; ++i)
        {
            for (int k = 35; k <=65; ++k)
            {
                black.row(i).col(k) = 0;
            }
        }

        for(int i = 57; i <= 62; ++i)
        {
            for (int k = 57; k <=62; ++k)
            {
                black.row(i).col(k) = 255;
            }
        }

        for(int i = 90; i <= 99; ++i)
        {
            for (int k = 90; k <=99; ++k)
            {
                black.row(i).col(k) = 255;
            }
        }
    }


    cv::namedWindow( "Components", CV_WINDOW_AUTOSIZE );
    cv::imshow( "Components", black );

    std::vector<uchar> buff;

    std::vector<int> p;
    p.push_back(CV_IMWRITE_JPEG_QUALITY);
    p.push_back(9);

    cv::imencode(".jpg", black, buff);

    std::ofstream outfile ("test.jpg");
    send_data(outfile, buff);
    outfile.close();

    cv::waitKey(0);
    std::cin.get();
    return 0;
}

1 Ответ

2 голосов
/ 16 ноября 2011

Вам нужно открыть выходной файл в двоичном режиме.

std::ofstream outfile ("test.jpg", std::ofstream::binary);
...