2011-11-16 11 views
4

cv::imencode apisostreamに画像を保存しようとしています。 imencodeからベクトルを取得します。 shown hereとして、任意のostreamに格納できます。例えば、std::ofstream。ここでcv :: imencodeからエンコードされたイメージを取得できません。どのように.jpgの壊れた保存を修正するには?

enter image description here

たちは、ファイルに得るものです::

enter image description here

そしてここでは、私たちのコードは次のとおりです。

しかし、これは我々が見たものであるデータ=(

をcurrupting失敗します

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

答えて

2

あなたが開く必要がありますバイナリモードの出力ファイル

std::ofstream outfile ("test.jpg", std::ofstream::binary); 
関連する問題