AVI ファイルの真ん中の画像を取得する

久々の OpenCV プログラミング.cvQueryFrame() 用の IplImage のメモリ確保・解放いずれも不要っていう仕様につまづいた.cvReleaseImage() でキレられた.確保時にはがんばって cvSize(cvGetCaptureProperty(), cvGetCaptureProperty() ) を書いたけれども不要に.

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

#include <stdio.h>

int main(int argc, char **argv)
{
	char *filename="138.avi";
	IplImage *image;
	CvCapture *capture;
	double frame_count;

	capture = cvCaptureFromAVI(filename);
	if(capture == NULL)
	{
		printf("動画読み込み不能\n");
		return 0;
	}

	// 総フレーム数を取得する
	frame_count = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
	// 真ん中の位置に移動する
	cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frame_count/2);
	// 画像を取り出す
	image = cvQueryFrame(capture);

	// 表示してみる
	char *window_name = "真ん中の画像";
	cvNamedWindow(window_name);
	cvShowImage(window_name, image);
	printf("この動画の総フレーム数は %.0lf です.\n", frame_count);
	cvWaitKey();

	// 保存する
	cvSaveImage("still.png", image);

	// メモリ開放
	cvReleaseCapture(&capture);
	
	return 0;
}