【Intel】OpenCV総合スレ【画像処理】2 の 451 がもたらした情報を検証 その3

huffyuv による可逆圧縮コーデックの利用により,問題を解決した.

情報

aviの読み込み

dsk? (2008-05-09 (金) 15:32:30)

cvWriteFrame?を使って書き込んだビデオファイル(avi)を他のプログラムでcvCaptureFromAVIを使って読み込むと,全体が紫色に染まったような画像になります.

ビデオファイル書き込みの際は,「fourcc = -1」にしてコーデックを指定できるようにして,圧縮プログラムを「全フレーム(未圧縮)」に指定しています.

保存した動画をそのまま読み込める方法を知っている方がいましたら,教えてください.

よろしくお願いします.

  • 初めまして。同様の症状がでたことがあります。直接の解決にはなりませんが、私の場合はcvWriteFrame?で書き込む際にコーデックとしてhuffyuvを選択すると問題なく読み込めました。 -- renn? 2008-05-27 (火) 15:50:48
  • 御返事ありがとうございます.早速試してみます. -- dsk? 2008-05-28 (水) 12:45:27
掲示板 - OpenCV@Chihara-Lab.

なるほどなあ.紫云々は知らないけれど,可逆圧縮をかけようという話.本家配布ページは無く,バックアップページなどから huffyuv コーデックを入手する.

CvVideoWriter *writer を変える.

CvVideoWriter *writer = cvCreateAVIWriter(out_avi, -1, 
	cvGetCaptureProperty(capture, CV_CAP_PROP_FPS),
	cvSize( (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT))
	);

エンコーダ選択画面で,huffyuv v2.1.1 を選択する.設定は変えない.

真空波動研Lite 081122 / DLL 081122

[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 HuffYUV 5.00fps 90f 2454.41kb/s
[RIFF(AVI1.0)] 00:00:18.000 (18.000sec) / 17,701,376Bytes

ソース

// 事前に out_stills ってフォルダを作っておくこと!
#define AVIOUT_NOSKIP 1 // 動画・静止画出力を省略

#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_NOSKIP
	CvVideoWriter *writer = cvCreateAVIWriter(out_avi, -1, 
		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;
}

結果

   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: 差なし       
   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: 差なし       

グゥレイト!やったぜ!