###前提・実現したいこと
OpenCVを使って取得した動画像をMFCでダイアログに表示するプログラムを作っています。
非常にシンプルで、Loadボタンより再生したい動画ファイルを取得し、その下のスペースに表示後、OKボタンで再生が開始されるというものです。
###発生している問題・エラーメッセージ
以下のサイトを参考に作成したのですが、Opencvのcv::Videocaptureのopenが上手く行きません。
http://takacity.blog.fc2.com/blog-entry-96.html
常に、下記コードの「OnBnClickedButtonLoad1」でAfxMessageBox(errorDisplay)が出力される状態です。
###該当のソースコード
C++
1ImageProcess Movie1; 2void CMainDlg::OnBnClickedButtonLoad1() 3{ 4 string movieFileName = openMovieFileName(MovieFileName1); 5 6 if (!Movie1.open(movieFileName)){ 7 CString errorDisplay; 8 errorDisplay.Format(_T("読み込みエラー!\n error file name :\n %s"), movieFileName); 9 AfxMessageBox(errorDisplay); 10 } 11 else{ 12 setBitmapFromMat(Movie1.currentImg); 13 } 14 15}
C++
1string CMainDlg::openMovieFileName(CString &editBox) 2{ 3 CString filter("Movie Files (*.avi;*.wmv;*.mp4)|*.avi; *.wmv; *.mp4||"); 4 CFileDialog selDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter); 5 6 if (selDlg.DoModal() == IDOK) 7 { 8 editBox = selDlg.GetPathName(); 9 UpdateData(FALSE); 10 11 CStringA csTempmb(editBox.GetBuffer(0)); 12 string fileName = csTempmb.GetBuffer(0); 13 14 return fileName; 15 } 16 17 return false; 18}
C++
1void CMainDlg::setBitmapFromMat(Mat img) 2{ 3 4 CBitmap m_bmp; //画像(bitmapファイル) 5 char* ColorBuf = (char*)calloc(img.rows * img.rows * 4, sizeof(RGBQUAD)); 6 7 for (int y = 0; y < img.rows; y++) { 8 for (int x = 0; x < img.cols; x++) { 9 // Blue 10 ColorBuf[y * img.cols * 4 + x * 4 + 0] = img.data[y * img.step + x * 3 + 0]; 11 // Green 12 ColorBuf[y * img.cols * 4 + x * 4 + 1] = img.data[y * img.step + x * 3 + 1]; 13 // Red 14 ColorBuf[y * img.cols * 4 + x * 4 + 2] = img.data[y * img.step + x * 3 + 2]; 15 //Reserved 16 ColorBuf[y * img.cols * 4 + x * 4 + 3] = 0; 17 } 18 } 19 20 m_bmp.CreateBitmap(img.cols, img.rows, 1, 32, ColorBuf); 21 free(ColorBuf); 22 23 CStatic* pictbox = (CStatic*)GetDlgItem(IDC_STATIC_BMP1); 24 pictbox->SetBitmap(m_bmp); //Picture Controlに表示 25 26 return; 27 28}
C++
1bool ImageProcess::open(string fileName){ 2 3 // open movie 4 cap.open(fileName); 5 if (cap.isOpened()){ 6 return false; 7 } 8 9 cap >> currentImg; 10 11 return true; 12 13}
###試したこと
①ファイルの取得および出力は以下より問題ないことを確認しています。
・テキストボックスに表示される結果が適切。
・ImageProcess::open内でfileNameをcsvファイルで出力した結果適切。
②cap.open()の引数を"test.wmvとしてソースコード直下に該当動画を入れて見たが動画は同様にAfxMessageBoxが呼び出される。
###補足情報(言語/FW/ツール等のバージョンなど)
opencv : 2.4.10
visual studio : 2013
言語:C++
あなたの回答
tips
プレビュー