【Intel】OpenCV総合スレ【画像処理】2 の 451 がもたらした情報を検証
実験内容
90フレームの動画ファイルを使用し,加工せずに動画・静止画として保存.その後,動画・静止画間でのデータの違いを検証.違い検証は次の2パターンを実施.
- 入力した動画と出力した静止画
- 出力した動画と出力した静止画
加工せずに保存しているのだから,違いが発生するわけないだろうと予想する.
結果
- 先に挙げた後者のパターンで画素データが変化した
対策方法
不明.query->imageData += 0x400 とかやってるとコケる.
memcmp、wmemcmp戻り値
戻り値は、2 つのバッファの関係を示します。
戻り値 buf1 と buf2 の最初の count バイト数の関係 < 0 buf1 は buf2 より小さい。 0 buf1 と buf2 は等しい。 > 0 buf1 は buf2 より大きい。
ここからつっこんでみよう.後で.
情報
451 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/30(日) 22:35:40 http://tessy.org/wiki/index.php?%A5%D3%A5%C7%A5%AA%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF ここのサイトに、 OpenCVで生成した非圧縮AVIはOpenCVで読み込むと失敗する模様 と書いてあるんですが、どうもその現象に嵌ったらしくて動画が読み込んだときに右にずれてしまいます(ずれた分は左にから表示される) 対策として、 image->imageData += 0x400 とすると合う. と書いてあるんですが、いまいちこれをどこに挿入したらいいのかわかりません。 これっておそらく動画のヘッダ部分が1024バイト分=0x400ずれているのだと思うのですが、 どの辺りに挿入したらいいのかわかりますか? CvCapture *video; // キャプチャ構造体 IplImage *image; // 画像のポインタ(領域確保は不要) cvNamedWindow(WINDOW_INPUT); // ウィンドウ生成 video = cvCaptureFromAVI(DEFAULT_VIDEO);//キャプチャ構造体生成 while(c = cvWaitKey(1), c != 27){ // ループ image = cvQueryFrame(video); // ビデオから1枚取得 cvShowImage(WINDOW_INPUT, image); // 画面に表示 } cvReleaseCapture(&video); // ビデオ構造体解放 cvDestroyWindow(WINDOW_INPUT); // ウィンドウ破棄 // imageはこの場合解放してはいけないらしい 452 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/31(月) 10:58:56 image = cvQueryFrame(video); // ビデオから1枚取得 image->imageData += 0x400 cvShowImage(WINDOW_INPUT, image); // 画面に表示 素直に、これでいいんでねーの? 責任は取らんが。 453 名前:デフォルトの名無しさん[sage] 投稿日:2009/08/31(月) 11:07:24 image->imageData += 0x400 とかするとメモリーリークしそうだが大丈夫なんかね【Intel】OpenCV総合スレ【画像処理】2
ソース
// 事前に out_stills ってフォルダを作っておくこと! #include <stdio.h> #include "cv.h" #include "cxcore.h" #include "highgui.h" #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib") void echo_memcmp( int image_num, int memcmp_result ) { static int crlf = 0; if ( memcmp_result == 0 ) printf("%4d: 差なし %5s", image_num, ""); else printf("%4d: 差あり: %5d", image_num, memcmp_result); crlf++; if ( crlf % 4 == 0) printf("\n"); } int main ( int argc, char **argv ) { const char *in_avi = "c:/data/video/90frame.avi"; const char *out_avi = "c:/data/video/90frame_tmp.avi"; const char *out_stills = "out_stills/"; char buffer[BUFSIZ]; int i; // 圧縮しないで AVI に保存.比較用に静止画を保存 CvCapture *capture = cvCaptureFromAVI(in_avi); CvVideoWriter *writer = cvCreateAVIWriter(out_avi, CV_FOURCC('D','I','B',' '), cvGetCaptureProperty(capture, CV_CAP_PROP_FPS), cvSize( (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)) ); IplImage *query; for( i = 0; query = cvQueryFrame(capture); i++ ) { sprintf_s(buffer, BUFSIZ-1, "%s%d%s", out_stills, i, ".png"); cvSaveImage(buffer, query); cvWriteFrame(writer, query); } // 動画出力完了 cvReleaseVideoWriter(&writer); // 入力動画と静止画とで比較 cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 0.0); IplImage *still; for( i = 0; query = cvQueryFrame(capture); i++ ) { sprintf_s(buffer, BUFSIZ-1, "%s%d%s", out_stills, i, ".png"); still = cvLoadImage(buffer); echo_memcmp( i, memcmp( query->imageData, still->imageData, query->imageSize ) ); cvReleaseImage(&still); } // 入力動画を破棄 cvReleaseCapture(&capture); // 出力動画と静止画とで比較 capture = cvCaptureFromAVI(out_avi); for( i = 0; query = cvQueryFrame(capture); i++ ) { sprintf_s(buffer, BUFSIZ-1, "%s%d%s", out_stills, i, ".png"); still = cvLoadImage(buffer); echo_memcmp( i, memcmp( query->imageData, still->imageData, query->imageSize ) ); cvReleaseImage(&still); } // 出力動画を破棄 cvReleaseCapture(&capture); return 0; }
動画情報
[90frame.avi] 256x256 24Bit 無圧縮 5.00fps 90f 7864.64kb/s [RIFF(AVI1.0)] 00:00:18.000 (18.000sec) / 17,700,984Bytes [90frame_tmp.avi] 256x256 24Bit 無圧縮 5.00fps 90f 7864.64kb/s [RIFF(AVI1.0)] 00:00:18.000 (18.000sec) / 17,701,376Bytes 真空波動研Lite 081122 / DLL 081122
コンソール出力
0: 差なし 1: 差なし 2: 差なし 3: 差なし 4: 差なし 5: 差なし 6: 差なし 7: 差なし 8: 差なし 9: 差なし 10: 差なし 11: 差なし 12: 差なし 13: 差なし 14: 差なし 15: 差なし 16: 差なし 17: 差なし 18: 差なし 19: 差なし 20: 差なし 21: 差なし 22: 差なし 23: 差なし 24: 差なし 25: 差なし 26: 差なし 27: 差なし 28: 差なし 29: 差なし 30: 差なし 31: 差なし 32: 差なし 33: 差なし 34: 差なし 35: 差なし 36: 差なし 37: 差なし 38: 差なし 39: 差なし 40: 差なし 41: 差なし 42: 差なし 43: 差なし 44: 差なし 45: 差なし 46: 差なし 47: 差なし 48: 差なし 49: 差なし 50: 差なし 51: 差なし 52: 差なし 53: 差なし 54: 差なし 55: 差なし 56: 差なし 57: 差なし 58: 差なし 59: 差なし 60: 差なし 61: 差なし 62: 差なし 63: 差なし 64: 差なし 65: 差なし 66: 差なし 67: 差なし 68: 差なし 69: 差なし 70: 差なし 71: 差なし 72: 差なし 73: 差なし 74: 差なし 75: 差なし 76: 差なし 77: 差なし 78: 差なし 79: 差なし 80: 差なし 81: 差なし 82: 差なし 83: 差なし 84: 差なし 85: 差なし 86: 差なし 87: 差なし 88: 差なし 89: 差なし 0: 差あり: -1 1: 差あり: -1 2: 差あり: -1 3: 差あり: -1 4: 差あり: -1 5: 差あり: -1 6: 差あり: -1 7: 差あり: -1 8: 差あり: -1 9: 差あり: -1 10: 差あり: -1 11: 差あり: -1 12: 差あり: -1 13: 差あり: -1 14: 差あり: -1 15: 差あり: -1 16: 差あり: -1 17: 差あり: -1 18: 差あり: -1 19: 差あり: -1 20: 差あり: -1 21: 差あり: -1 22: 差あり: -1 23: 差あり: -1 24: 差あり: -1 25: 差あり: -1 26: 差あり: -1 27: 差あり: -1 28: 差あり: -1 29: 差あり: -1 30: 差あり: -1 31: 差あり: -1 32: 差あり: -1 33: 差あり: -1 34: 差あり: -1 35: 差あり: -1 36: 差あり: -1 37: 差あり: -1 38: 差あり: -1 39: 差あり: -1 40: 差あり: -1 41: 差あり: -1 42: 差あり: -1 43: 差あり: -1 44: 差あり: -1 45: 差あり: -1 46: 差あり: -1 47: 差あり: -1 48: 差あり: -1 49: 差あり: -1 50: 差あり: -1 51: 差あり: -1 52: 差あり: -1 53: 差あり: -1 54: 差あり: -1 55: 差あり: -1 56: 差あり: -1 57: 差あり: -1 58: 差あり: -1 59: 差あり: -1 60: 差あり: -1 61: 差あり: -1 62: 差あり: -1 63: 差あり: -1 64: 差あり: -1 65: 差あり: -1 66: 差あり: -1 67: 差あり: -1 68: 差あり: -1 69: 差あり: -1 70: 差あり: -1 71: 差あり: -1 72: 差あり: -1 73: 差あり: -1 74: 差あり: -1 75: 差あり: -1 76: 差あり: -1 77: 差あり: -1 78: 差あり: -1 79: 差あり: -1 80: 差あり: -1 81: 差あり: -1 82: 差あり: -1 83: 差あり: -1 84: 差あり: -1 85: 差あり: -1 86: 差あり: -1 87: 差あり: -1 88: 差あり: -1 89: 差あり: -1