【Intel】OpenCV総合スレ【画像処理】2 の 451 がもたらした情報を検証 その2
前回は memcmp() により真実らしいことを確認した.今回は imadaData メンバをコンソール出力し,どう異なるのかを調べた.
まったく,どう対策したらいいんだろうな.
ソース
前回のコードをちょっと改造した.
- echo_memdata() を作った
- 動画・静止画出力をしたいときには AVIOUT_SKIP を 1 にする
- echo_memdata() は比較の1枚目のみ実施
// 事前に out_stills ってフォルダを作っておくこと! #define AVIOUT_SKIP 0 // 動画・静止画出力を省略 #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") // imageData メンバを並べて表示 // 1行当たり 16 個 void echo_memdata( IplImage *still_image, IplImage *video_frame ) { // 1行にデータを並べる個数 const int NUM_PER_LINE = 16; for ( int i = 0; i < still_image->imageSize/NUM_PER_LINE; i += NUM_PER_LINE ) { printf("静止画: "); for ( int j = 0; j < NUM_PER_LINE; j++ ) { printf("%3x", (unsigned char *)still_image->imageData[j + i * NUM_PER_LINE]); } printf("\n"); printf(" 動画: "); for ( int j = 0; j < NUM_PER_LINE; j++ ) { printf("%3x", (unsigned char *)video_frame->imageData[j + i * NUM_PER_LINE]); } printf("\n"); } } // memcmp の結果を表示 // 1行当たり 4 枚 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; IplImage *query; // 圧縮しないで AVI に保存.比較用に静止画を保存 CvCapture *capture = cvCaptureFromAVI(in_avi); #if AVIOUT_SKIP 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)) ); 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); #endif // 入力動画と静止画とで比較 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 ) ); if (i == 0 ) echo_memdata(still, query); 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 ) ); if (i == 0 ) echo_memdata(still, query); cvReleaseImage(&still); } // 出力動画を破棄 cvReleaseCapture(&capture); return 0; }
結果
3532行,230,546バイトになった.a.txt に出力させたものをいくつか抜粋する.
静止画・入力動画間
静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 0 1 0 0 0 0 0 0 3 0 1 4 1 2 2 0 動画: 0 1 0 0 0 0 0 0 3 0 1 4 1 2 2 0 静止画: 4 0 0 3 0 0 4 0 0 5 0 0 4 0 0 4 動画: 4 0 0 3 0 0 4 0 0 5 0 0 4 0 0 4 (中略) 静止画: 3a 68 21 3b 69 22 3c 6a 24 3d 6d 22 3b 6b 21 3a 動画: 3a 68 21 3b 69 22 3c 6a 24 3d 6d 22 3b 6b 21 3a 静止画: ffffff83 2b 4cffffff83 2b 4cffffff83 29 4affffff81 28 49ffffff80 2a 4bffffff82 動画: ffffff83 2b 4cffffff83 2b 4cffffff83 29 4affffff81 28 49ffffff80 2a 4bffffff82 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 静止画: 48 7a 26 4a 7e 26 4a 7e 2a 4effffff84 29 4dffffff83 26 4c 動画: 48 7a 26 4a 7e 26 4a 7e 2a 4effffff84 29 4dffffff83 26 4c 静止画: 60 c 2b 5e c 2a 59 9 27 56 8 24 52 7 23 51 動画: 60 c 2b 5e c 2a 59 9 27 56 8 24 52 7 23 51 (以下略)
静止画・出力動画間
静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 4 0 0 3 0 0 4 0 0 5 0 0 4 0 0 4 静止画: 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 7e 2b 49ffffff80 2c 4a 7f 2b 49 7e 2b 47 7c 2a 46 7b 静止画: 33 5f 1c 32 61 1d 33 62 1c 34 64 1c 34 64 1c 34 動画: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: ffffffd8 63ffffff8dffffffd6 62ffffff8cffffffd5 61ffffff8bffffffd4 60ffffff8affffffd3 60ffffff8affffffd3 静止画: 4effffff95 29 50ffffff9a 28 4fffffff99 26 50ffffff99 20 4affffff93 19 43 動画: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 (中略) 静止画: 62 b 2c 5f c 2a 59 9 27 56 7 26 53 6 25 52 動画: 48 7a 26 4a 7e 26 4a 7e 2a 4effffff84 29 4dffffff83 26 4c 静止画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 動画: 58 d 29 58 f 28 54 d 26 52 b 23 4d 7 1f 49 静止画: 48 7a 26 4a 7e 26 4a 7e 2a 4effffff84 29 4dffffff83 26 4c 動画: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 静止画: 60 c 2b 5e c 2a 59 9 27 56 8 24 52 7 23 51 動画: 44 75 27 4a 7c 28 4b 7d 27 4b 7f 27 4b 7f 25 4b (以下略)