C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: openCV/C++での動画ファイルの再生


(過去ログ 124 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■74051 / inTopicNo.1)  openCV/C++での動画ファイルの再生
  
□投稿者/ mako_chan3 (5回)-(2014/11/26(Wed) 13:43:52)

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




引用返信 編集キー/
■74055 / inTopicNo.2)  Re[1]: openCV/C++での動画ファイルの再生
□投稿者/ とっちゃん (279回)-(2014/11/26(Wed) 16:39:07)
とっちゃん さんの Web サイト
No74051 (mako_chan3 さん) に返信

> ネット上のサンプルコードを試してみるのですが、動画ファイルへのアクセスのところで止まってしまいます。
> プロジェクトの構成は「ボタン」を配置、「ボタン」をクリックすると動画ファイルを取得、再生します。
>
> いくつかのサンプルコードを試しましたが、毎回同じところで例外が発生して止まります。
> 色々と原因を探してみましたが見つかりませんでした。
>

<<該当部分以外のソース省略>>
> //ビデオファイルのオープンとビデオキャプチャクラスのインスタンスの生成
> cv::VideoCapture cap("tree.avi");  ←ここで例外が発生し処理が止まってしまう。
>
例外発生は、ここですよね?
例外の詳細は確認しましたか?

例外が発生する、エラーが発生するという場合まずはそのエラーや例外の詳細を確認しましょう。
例外が発生したのであれば、どのような例外が発生し、その中に含まれる情報には何があるのかを
まず確認しましょう。

そのうえで、その例外の内容も質問文に記載して、どうすればいいかを質問すると
より具体的にどうすればいいという回答が得られると思います。

引用返信 編集キー/
■74059 / inTopicNo.3)  Re[2]: openCV/C++での動画ファイルの再生
□投稿者/ mako_chan3 (6回)-(2014/11/27(Thu) 07:41:11)
No74055 (とっちゃん さん) に返信
> ■No74051 (mako_chan3 さん) に返信
>
>>ネット上のサンプルコードを試してみるのですが、動画ファイルへのアクセスのところで止まってしまいます。
>>プロジェクトの構成は「ボタン」を配置、「ボタン」をクリックすると動画ファイルを取得、再生します。
>>
>>いくつかのサンプルコードを試しましたが、毎回同じところで例外が発生して止まります。
>>色々と原因を探してみましたが見つかりませんでした。
>>
>
> <<該当部分以外のソース省略>>
>> //ビデオファイルのオープンとビデオキャプチャクラスのインスタンスの生成
>> cv::VideoCapture cap("tree.avi");  ←ここで例外が発生し処理が止まってしまう。
>>
> 例外発生は、ここですよね?
> 例外の詳細は確認しましたか?
>
> 例外が発生する、エラーが発生するという場合まずはそのエラーや例外の詳細を確認しましょう。
> 例外が発生したのであれば、どのような例外が発生し、その中に含まれる情報には何があるのかを
> まず確認しましょう。
>
> そのうえで、その例外の内容も質問文に記載して、どうすればいいかを質問すると
> より具体的にどうすればいいという回答が得られると思います。
>

ご助言ありがとうございます。
エラー発生時に表示されたコメントは下記の通りです。
「20141126_video-capture-test_02.exe の 0x00905a4d でハンドルされていない例外が発生しました: 0xC0000005: Access violation」
正直これを見ても原因が分かりづらかったため、最初の質問では添付しませんでした。

また、基本的な問題としてこの2つの記述自体は正しいのでしょうか。

宜しくお願いいたします。

引用返信 編集キー/
■74061 / inTopicNo.4)  Re[3]: openCV/C++での動画ファイルの再生
□投稿者/ とっちゃん (280回)-(2014/11/27(Thu) 11:03:34)
とっちゃん さんの Web サイト
No74059 (mako_chan3 さん) に返信
> ご助言ありがとうございます。
> エラー発生時に表示されたコメントは下記の通りです。
> 「20141126_video-capture-test_02.exe の 0x00905a4d でハンドルされていない例外が発生しました: 0xC0000005: Access violation」
> 正直これを見ても原因が分かりづらかったため、最初の質問では添付しませんでした。
>
ソースコードを見ただけでは、この例外が発生することは誰にも突き止められないと思います。


> また、基本的な問題としてこの2つの記述自体は正しいのでしょうか。
>
現状ではアクセス違反が発生していますので、正しいとは言えないと思います。
原因がわからないので、それがプログラムソースが正しくないと言い切れるものなのか?
については分かりません。

ひとまず、tree.avi ファイルをフルパス指定してみるとかを試してみると状況が変わるかもしれませんよ。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -