|
分類:[C/C++]
お世話になります。
oenCVで動画ファイルの取得、再生にトライしています。
環境:VisualStudio2010 C++、openCV2.2
ネット上のサンプルコードを試してみるのですが、動画ファイルへのアクセスのところで止まってしまいます。
プロジェクトの構成は「ボタン」を配置、「ボタン」をクリックすると動画ファイルを取得、再生します。
いくつかのサンプルコードを試しましたが、毎回同じところで例外が発生して止まります。
色々と原因を探してみましたが見つかりませんでした。
下記にコードを2種類添付しました。
ご助言をお願いします。
(コード1)
// 20141126_video-capture-test_02Dlg.cpp : 実装ファイル
//
#include "stdafx.h"
#include "20141126_video-capture-test_02.h"
#include "20141126_video-capture-test_02Dlg.h"
#include "afxdialogex.h"
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMy20141126_videocapturetest_02Dlg ダイアログ
CMy20141126_videocapturetest_02Dlg::CMy20141126_videocapturetest_02Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMy20141126_videocapturetest_02Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy20141126_videocapturetest_02Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMy20141126_videocapturetest_02Dlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMy20141126_videocapturetest_02Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CMy20141126_videocapturetest_02Dlg メッセージ ハンドラー
BOOL CMy20141126_videocapturetest_02Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
// 下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
// これは、Framework によって自動的に設定されます。
void CMy20141126_videocapturetest_02Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 描画のデバイス コンテキスト
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// クライアントの四角形領域内の中央
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// アイコンの描画
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
// システムがこの関数を呼び出します。
HCURSOR CMy20141126_videocapturetest_02Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMy20141126_videocapturetest_02Dlg::OnBnClickedButton1()
{
// TODO: ここにコントロール通知ハンドラー コードを追加します。
CvCapture* capture;
IplImage* frame=NULL;
//動画ファイル名
char *FileName="tree.avi";
//動画ファイルを開く
if((capture=cvCaptureFromFile(FileName))==NULL){ ←ここで例外が発生し処理が止まってしまう。
return;
}
cvNamedWindow("CaptureFromFile", CV_WINDOW_AUTOSIZE);
while(1){
frame=cvQueryFrame(capture);
if(frame==NULL)
break;
cvShowImage("CaptureFromFile",frame);
if(cvWaitKey(30)=='\x1b')
break;
}
}
(コード2)
// 20141126_video-capture-test_03Dlg.cpp : 実装ファイル
//
#include "stdafx.h"
#include "20141126_video-capture-test_03.h"
#include "20141126_video-capture-test_03Dlg.h"
#include "afxdialogex.h"
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMy20141126_videocapturetest_03Dlg ダイアログ
CMy20141126_videocapturetest_03Dlg::CMy20141126_videocapturetest_03Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMy20141126_videocapturetest_03Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy20141126_videocapturetest_03Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMy20141126_videocapturetest_03Dlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMy20141126_videocapturetest_03Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CMy20141126_videocapturetest_03Dlg メッセージ ハンドラー
BOOL CMy20141126_videocapturetest_03Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
// 下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
// これは、Framework によって自動的に設定されます。
void CMy20141126_videocapturetest_03Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 描画のデバイス コンテキスト
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// クライアントの四角形領域内の中央
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// アイコンの描画
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
// システムがこの関数を呼び出します。
HCURSOR CMy20141126_videocapturetest_03Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMy20141126_videocapturetest_03Dlg::OnBnClickedButton1()
{
// TODO: ここにコントロール通知ハンドラー コードを追加します。
//ビデオファイルのオープンとビデオキャプチャクラスのインスタンスの生成
cv::VideoCapture cap("tree.avi"); ←ここで例外が発生し処理が止まってしまう。
//ウインドウの生成
cv::namedWindow("image",CV_WINDOW_AUTOSIZE);
while(true){
cv::Mat Img;
//新しいフレームを取得する
cap >> Img;
//フレームが空?
if(Img.empty())
break;
//ウインドウに表示
cv::imshow("image",Img);
//イベント待ち。ウインドウに表示させる場合はイベント待ちが必要
cv::waitKey(30);
}
//return;
}
|