【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
(以下略)