0

リアルタイム ビデオのすべてのフレームを .pgm 形式で保存したいと考えています。C ++でopencv 2.4.8を使用しています。私の問題は、すべてのフレームが保存され、現象的に正しい形式 (frame_1.pgm など) で保存されているにもかかわらず、それらを開くと、.pgm 写真のようにグレースケールではないことです。さらに、hexeditor で画像を開き、正しい pgm 写真と比較しましたが、明らかな違いがあります!誰かが私が間違っていることについて何かアドバイスをもらえますか??

ここに私のコードの重要な部分があります:

/////////////////////////////////////////////// ////////////

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);

   captureDevice1>> captureFrame1;


   imwrite("frame_55.pgm",captureFrame1,compression_params);


   //string imagename=argv[2];
   string imagename="frame_";
   //string imagename="frame_";
   char numberfile[17];
   sprintf_s(numberfile,17,"%u",im);
   imagename+=numberfile;
   imagename+=".pgm";

   std::ifstream in( imagename.c_str(), std::ios::binary );
   if ( !in )
   {
      std::cout << "Error in Image: " << imagename << std::endl;
      continue;
   }
   in.close();

/////////////////////////////////////////////// /////////////////////

image:frame_55.pgm を読み込もうとすると、他の .pgm イメージでは問題なく動作するのに、「サポートされていない形式」というエラーが表示されます!!

どうぞよろしくお願いします!!!

4

1 に答える 1

0

これは修正されたコードです:

//Device1

VideoCapture captureDevice1;
captureDevice1.open(0);

//setup files used in capture process
//Device1

Mat captureFrame1;
Mat grayscaleFrame1;



   for(int im=0; im<=numimages; im++){

    // Load the source image into our simple image class.


   captureDevice1>> captureFrame1;

   if(captureFrame1.empty())
   {
       cout<<"empty frame skipped"<<endl;
   continue;
    }


// name each frame as frame_numOframe

stringstream strs;
strs << im;
string temp_str = strs.str(); 
temp_str="frame_"+temp_str+".pgm";//assign coords into one string

//parameters for saving as .pgm

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);

cvtColor(captureFrame1,grayscaleFrame1, CV_BGR2GRAY);//convert to grayscale
imwrite(temp_str,grayscaleFrame1);//save image
于 2014-03-12T14:06:12.420 に答える