| 分類:[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; }
|