2016-09-12 16 views
0

私はimwrite()を使って画像を "face.jpg"のようにディスクに書き込むことができます。 fstreamを使ってこのjpgを配列に読み込みます。この配列は私が望むものです。Opencvすぐにマットから画像ストリームを取得する方法は?

しかし、これを迅速に取得するにはどうすればよいですか? memmory not diskから。 Mat.dataの画像データ長がMat.cols * Mat.rows.Iであると思っていました。私はfstreamをディスクに書き込んだ後、画像ビューアで何も表示しませんでした。何か間違っている必要があります。

Mat frame; 
VideoCapture cap(0); 
if (!cap.isOpened()) 
{ 
    return -1; 
} 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 160); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120); 
cap >> frame; 
if(frame.empty()){ 
    return -2; 
} 
//I just want the pointer and length of image information,the following is just for testing 
//whether that the same as I thought,if it's right ,frame.data and len is what I want,but it not work. 
FILE *fp = fopen("face.jpg", "wb"); 
if (NULL==fp) 
{ 
    return -1; 
} 
int len = frame.cols*frame.rows; //or 3*frame.cols*frame.rows 
fwrite(frame.data, len, sizeof(char), fp); 
fclose(fp); 


namedWindow("face", 1); 
imshow("face", frame); 
waitKey(1000); 

私はopencvで新しく、画像データを取得したいと思います。助けてください!

+1

は、あなたが望むかもしれませ 'imencode()' http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imencode – ZdaR

+0

正確にあなたが達成しようとしていますか?イメージから別の構造に生のバイトをコピーしたいですか? – slawekwin

+0

frame.cols * frame.rowsは、イメージが連続している場合にのみtrueになります。幅が477で、16の倍数ではない場合は、各行の最後に余白が追加される可能性があります.16または32の場合は覚えていませんが、パディングには2の累乗が使用されます。 – saurabheights

答えて

0

私はこれをimencode()で行いました。@ ZdaRのおかげです。

vector<uchar> buff; 
    vector<int>param = vector<int>(2); 
    param[0] = CV_IMWRITE_JPEG_QUALITY; 
    param[1] = 95; 
    imencode(".jpg", frame, buff, param); 
    int len = buff.size(); 
    FILE *fout; 
    fout = fopen("555.jpg", "wb"); 
    if(NULL==fout){ 
     return -3; 
    } 
    fwrite(&buff[0], 1, len*sizeof(uchar), fout); 
    fclose(fout); 
0

ディメンションをディスクに書き込む前にチェックしましたか?他の人があなたのコードをここで見るのに役立ちます。 Matの場合、データがグレースケールでない限り、サイズはcols *行以上になります。形式がRGB、RGBA、またはYUVなどであるかどうかを確認する必要があります.JPEGの場合、RGBXが最もよく使われます。ストリームのサイズが3 * cols * rowsか4 * cols * rowsかを実際に確認する必要があります。

+0

助けてくれてありがとう、コードをアップロードしました.the frame.stepは480(160,3)です、私は3 * cols *行をチェックしました。 – asdf

+0

ファイルを書き込む前にフレームのimshowを実行しようとするとよいでしょうか?データがあることを確認するだけです。そしてウェブカメラからのビデオストリームはありますか?あなたはおそらくそれを長く流すべきです。 – jamalin

+0

もちろん、ビデオストリームはLogitech C310から来ていますが、imshowはこのコードの下にあり、pefect.everythingはうまく動作しますが、私が望むものです。 – asdf

関連する問題