-7

私は opencv と c++ を使用して画像のピクセルをファイルに保存していますが、もう一度表示するために画像を復元したいと考えています。あなたはいくつかの提案をすることができますか?

[更新: OP のコメントからのコードが含まれています] これらのループを使用して、画像のピクセルをファイルに保存しています

for(int row=0; row<a;row++) 
    for(int col=0;col<b;col++) { 
        pixel[row][col]= ((uchar *)(img->imageData + row*img->widthStep))[col*img->nChannels +0]; 

今、画像を表示するためにこれらのピクセルを読み取ろうとしています

4

2 に答える 2

2

画像データをディスクに保存する標準的な (推奨される) 方法は、ピクセルを画像コンテナー (jpg/png/bmp/tiff/...) に入れ、それをファイルに保存することです。OpenCV はこのプロセスを非常に簡単に処理しますimg。これは、ファイルの名前をIplImage*呼び出して指定するだけでよいためです。cvSaveImage()

if (!cvSaveImage("output.png", img))
{
    // print cvSaveImage failed and deal with error
}

次に、このファイルをディスクから読み取るには、cvLoadImage()おそらく既に使用している を使用できます。

IplImageなんらかの不可解な理由で、実際にピクセルだけをファイルに保存している場合、それらを構造体に読み戻したいと思うことは完全に理解できます。この目的のために、探している関数は次のcvCreateImage()とおりです。

IplImage* new_img = cvCreateImage(cvSize(width, height), /*img depth*/, /* nChannels*/);

作成後、ピクセルを に読み込むnew_image必要があります。mempcy()new_image->imageData

ただし、このアプローチを使用するには、画像の実際のサイズを事前に知っておく必要があります。ファイル内に画像のピクセルを保存するだけの場合は、画像のサイズをファイル名の一部として保存することをお勧めします。

OpenCV 関数を使用して画像を処理する利点の 1 つは、システムがそれらを認識して表示できることです (これは、デバッグ目的で非常に重要です)。

于 2012-01-10T12:00:07.147 に答える
0
img->imageData = malloc(a*img->widthStep);  //do this if you didnt allocate the memory before. a*img->widthStep shouldbe the right size of memor needed if imn ot wrong.   
for(int row=0; row<a;row++) 
{
     for(int col=0;col<b;col++) 
     { 
  ((uchar*)(img->imageData + row*img->widthStep))[col*img->nChannels +0] = pixel[row][col];
   // you didnt say what is th type of date in imadeData : put other casts if necessary.
        }
    }

img->imageData のすべての情報を元のコードのピクセルに入れますか?

したがって、karlphillip の答え:「new_image->imageData に読み込まれたピクセルを mempcy() する必要があります」は、私のコードで行ったことです。

于 2012-01-10T01:35:48.843 に答える