#6
by ttb » 7年前
ありがとうございます。少し方法は違いますが自分でも作ってみました。しかし、webカメラ映像は読み込めるのに今回作っているプロジェクト(win32プロジェクト)ではaviutilでavi出力したファイルが読み込めませんでした。
しかし今回のプロジェクトとは別のプロジェクト(コンソールアプリケーション)では読み込むことが出来ました。
今回のプロジェクトで読み込めたのはAGデスクトップレコーダーでキャプチャーした動画ファイルは読み込むことが出来ました。
これは何が原因なのでしょか?
コードは以下になります。
Header.hには
以下の物を読み込んでいます。
#include<opencv2/opencv.hpp>
#include<opencv2/opencv_lib.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<windows.h>
#include <process.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <Commdlg.h>
#include <SDKDDKVer.h>
#include<iostream>
#include<stdio.h>
#define STATIC_ID0 00
#define BUTTON_ID1 0
#define BUTTON_ID2 1
#define BUTTON_ID3 2
#define BUTTON_ID4 3
#define BUTTON_ID5 4
#define BUTTON_ID6 5
#define BUTTON_ID7 6
コード:
#include"Header.h"
using namespace cv;
using namespace std;
Mat imgMatCamera1;
Mat imgMatCamera2;
Mat imgMatAvi;
Mat imgMatSyn1;
Mat imgMatSyn2;
IplImage *imgFromOpenCV1 = NULL;
IplImage *imgFromOpenCV2 = NULL;
IplImage img1;
IplImage img2;
HWND hwnd;
HWND hwPic = NULL;
HDC hDC = NULL;
HDC hDCPic = NULL;
DWORD dwThread;
BITMAPINFO bmpInfo1;
unsigned long* bmpData1 = NULL;
BITMAPINFO bmpInfo2;
unsigned long* bmpData2 = NULL;
void iplTobmp(const IplImage*, BITMAPINFO&, unsigned long*);
unsigned int __stdcall CameraCaptureThread(PVOID pv);
HANDLE threadHandle1 = NULL;
BOOL endFlag1 = FALSE;
unsigned int __stdcall GuideThread(PVOID pv);
HANDLE threadHandle2 = NULL;
BOOL endFlag2 = FALSE;
//スレッド1起動関数
void function1(HWND hwnd) {
threadHandle1 = (HANDLE)_beginthreadex(
NULL,
0,
CameraCaptureThread,
NULL,
0,
(unsigned int*)&dwThread);
if (!threadHandle1) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
}
}
//スレッド2起動関数
void function2(HWND hwnd) {
threadHandle2 = (HANDLE)_beginthreadex(
NULL,
0,
GuideThread,
NULL,
0,
(unsigned int*)&dwThread);
if (!threadHandle2) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
}
}
//iplimageからbmp変換
void iplTobmp(const IplImage* srcIplImage, BITMAPINFO& bmpInfo, unsigned long* bmpData) {
int width = srcIplImage->width;
int height = srcIplImage->height;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = width;
bmpInfo.bmiHeader.biHeight = height;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
unsigned long pixel;
unsigned char r, g, b;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
b = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3];
g = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 1];
r = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 2];
pixel = 0x00000000;
pixel = (r << 16) + (g << 8) + b;
bmpData[j + (height - i - 1) * width] = pixel;
}
}
}
//カメラ映像の表示
unsigned int __stdcall CameraCaptureThread(PVOID pv) {
VideoCapture cap1(0);
if (!cap1.isOpened()) {
return -1;
}
while (1){
if (endFlag1 == TRUE) {
break;
}
cap1 >> imgMatCamera1;
imgMatSyn1 = imgMatCamera1;
img1 = imgMatSyn1;
imgFromOpenCV1 = &img1;
//メモリを確保
if (bmpData1 != NULL) {
HeapFree(GetProcessHeap(), 0, bmpData1);
}
bmpData1 = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, imgFromOpenCV1->width * imgFromOpenCV1->height * 4);
//iplImageからDIBへ変換
iplTobmp(imgFromOpenCV1, bmpInfo1, bmpData1);
//ここで描画
StretchDIBits(hDC,
15, 20, imgFromOpenCV1->width*1.3, imgFromOpenCV1->height*1.3,
0, 0, imgFromOpenCV1->width, imgFromOpenCV1->height,
bmpData1, &bmpInfo1, DIB_RGB_COLORS, SRCCOPY);
}
return 0;
}
//動画の表示
unsigned int __stdcall GuideThread(PVOID pv) {
//VideoCapture cap12(0);
VideoCapture video("C:\\Users\tatebe riku\\Documents\\Visual Studio 2013\\Projects\\Win32Project1\\Win32Project1\\ddd.avi");
//if (!cap12.isOpened()) {
//return -1;
//}
if (!video.isOpened()) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("ファイルopenエラー"), MB_OK);
return -1;
}
while (1){
if (endFlag2==TRUE) {
break;
}
//cap12 >> imgMatCamera2;
video >> imgMatAvi;
//imgMatSyn2 = imgMatCamera2 +imgMatAvi;
img2 = imgMatAvi;
imgFromOpenCV2 = &img2;
//メモリを確保
if (bmpData2 != NULL) {
HeapFree(GetProcessHeap(), 0, bmpData2);
}
bmpData2 = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, imgFromOpenCV2->width * imgFromOpenCV2->height * 4);
//iplImageからDIBへ変換
iplTobmp(imgFromOpenCV2, bmpInfo2, bmpData2);
//ここで描画
StretchDIBits(hDC,
15, 20, imgFromOpenCV2->width*1.3, imgFromOpenCV2->height*1.3,
0, 0, imgFromOpenCV2->width, imgFromOpenCV2->height,
bmpData2, &bmpInfo2, DIB_RGB_COLORS, SRCCOPY);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
hwPic = GetDlgItem(hwnd, STATIC_ID0);
hDC = GetDC(hwPic);
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
switch (LOWORD(wp)) {
case BUTTON_ID1:
function1(hwnd);
break;
case BUTTON_ID2://開始
endFlag1 = TRUE;
WaitForSingleObject(threadHandle1, INFINITE);
CloseHandle(threadHandle1);
if (imgFromOpenCV1 != NULL){
HeapFree(GetProcessHeap(), 0, bmpData1);
}
if (threadHandle2 != NULL) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
//break;
}
function2(hwnd);
break;
case BUTTON_ID3://終了
break;
case BUTTON_ID4:
break;
case BUTTON_ID5:
break;
case BUTTON_ID6:
break;
}
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
//ウィンドウの設定
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("opencv");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("opencv"), TEXT("Training System"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MAXIMIZE,
0, 0, 1350, 800,
NULL, NULL, hInstance, NULL);
CreateWindow(
TEXT("STATIC"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_BITMAP ,
0, 0, 870, 660,
hwnd, (HMENU)STATIC_ID0, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("WebCamera start-up"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
900, 80, 250, 50,
hwnd, (HMENU)BUTTON_ID1, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Sample display"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
900, 400, 150, 50,
hwnd, (HMENU)BUTTON_ID2, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Sample Exit"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1170, 400, 150, 50,
hwnd, (HMENU)BUTTON_ID3, hInstance, NULL);
CreateWindow(
TEXT("STATIC"), TEXT("Select Level"),
WS_CHILD | WS_VISIBLE | WS_BORDER ,
880, 220, 450, 100,
hwnd, NULL, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Beginner"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
900, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID4, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Intermediate"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
1050, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID5, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Advanced"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
1200, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID6, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Judge"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1200, 500, 120, 50,
hwnd, (HMENU)BUTTON_ID7, hInstance, NULL);
if (hwnd == NULL) return -1;
while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}
ありがとうございます。少し方法は違いますが自分でも作ってみました。しかし、webカメラ映像は読み込めるのに今回作っているプロジェクト(win32プロジェクト)ではaviutilでavi出力したファイルが読み込めませんでした。
しかし今回のプロジェクトとは別のプロジェクト(コンソールアプリケーション)では読み込むことが出来ました。
今回のプロジェクトで読み込めたのはAGデスクトップレコーダーでキャプチャーした動画ファイルは読み込むことが出来ました。
これは何が原因なのでしょか?
コードは以下になります。
Header.hには
以下の物を読み込んでいます。
#include<opencv2/opencv.hpp>
#include<opencv2/opencv_lib.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<windows.h>
#include <process.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <Commdlg.h>
#include <SDKDDKVer.h>
#include<iostream>
#include<stdio.h>
#define STATIC_ID0 00
#define BUTTON_ID1 0
#define BUTTON_ID2 1
#define BUTTON_ID3 2
#define BUTTON_ID4 3
#define BUTTON_ID5 4
#define BUTTON_ID6 5
#define BUTTON_ID7 6
[code]
#include"Header.h"
using namespace cv;
using namespace std;
Mat imgMatCamera1;
Mat imgMatCamera2;
Mat imgMatAvi;
Mat imgMatSyn1;
Mat imgMatSyn2;
IplImage *imgFromOpenCV1 = NULL;
IplImage *imgFromOpenCV2 = NULL;
IplImage img1;
IplImage img2;
HWND hwnd;
HWND hwPic = NULL;
HDC hDC = NULL;
HDC hDCPic = NULL;
DWORD dwThread;
BITMAPINFO bmpInfo1;
unsigned long* bmpData1 = NULL;
BITMAPINFO bmpInfo2;
unsigned long* bmpData2 = NULL;
void iplTobmp(const IplImage*, BITMAPINFO&, unsigned long*);
unsigned int __stdcall CameraCaptureThread(PVOID pv);
HANDLE threadHandle1 = NULL;
BOOL endFlag1 = FALSE;
unsigned int __stdcall GuideThread(PVOID pv);
HANDLE threadHandle2 = NULL;
BOOL endFlag2 = FALSE;
//スレッド1起動関数
void function1(HWND hwnd) {
threadHandle1 = (HANDLE)_beginthreadex(
NULL,
0,
CameraCaptureThread,
NULL,
0,
(unsigned int*)&dwThread);
if (!threadHandle1) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
}
}
//スレッド2起動関数
void function2(HWND hwnd) {
threadHandle2 = (HANDLE)_beginthreadex(
NULL,
0,
GuideThread,
NULL,
0,
(unsigned int*)&dwThread);
if (!threadHandle2) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
}
}
//iplimageからbmp変換
void iplTobmp(const IplImage* srcIplImage, BITMAPINFO& bmpInfo, unsigned long* bmpData) {
int width = srcIplImage->width;
int height = srcIplImage->height;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = width;
bmpInfo.bmiHeader.biHeight = height;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
unsigned long pixel;
unsigned char r, g, b;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
b = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3];
g = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 1];
r = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 2];
pixel = 0x00000000;
pixel = (r << 16) + (g << 8) + b;
bmpData[j + (height - i - 1) * width] = pixel;
}
}
}
//カメラ映像の表示
unsigned int __stdcall CameraCaptureThread(PVOID pv) {
VideoCapture cap1(0);
if (!cap1.isOpened()) {
return -1;
}
while (1){
if (endFlag1 == TRUE) {
break;
}
cap1 >> imgMatCamera1;
imgMatSyn1 = imgMatCamera1;
img1 = imgMatSyn1;
imgFromOpenCV1 = &img1;
//メモリを確保
if (bmpData1 != NULL) {
HeapFree(GetProcessHeap(), 0, bmpData1);
}
bmpData1 = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, imgFromOpenCV1->width * imgFromOpenCV1->height * 4);
//iplImageからDIBへ変換
iplTobmp(imgFromOpenCV1, bmpInfo1, bmpData1);
//ここで描画
StretchDIBits(hDC,
15, 20, imgFromOpenCV1->width*1.3, imgFromOpenCV1->height*1.3,
0, 0, imgFromOpenCV1->width, imgFromOpenCV1->height,
bmpData1, &bmpInfo1, DIB_RGB_COLORS, SRCCOPY);
}
return 0;
}
//動画の表示
unsigned int __stdcall GuideThread(PVOID pv) {
//VideoCapture cap12(0);
VideoCapture video("C:\\Users\tatebe riku\\Documents\\Visual Studio 2013\\Projects\\Win32Project1\\Win32Project1\\ddd.avi");
//if (!cap12.isOpened()) {
//return -1;
//}
if (!video.isOpened()) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("ファイルopenエラー"), MB_OK);
return -1;
}
while (1){
if (endFlag2==TRUE) {
break;
}
//cap12 >> imgMatCamera2;
video >> imgMatAvi;
//imgMatSyn2 = imgMatCamera2 +imgMatAvi;
img2 = imgMatAvi;
imgFromOpenCV2 = &img2;
//メモリを確保
if (bmpData2 != NULL) {
HeapFree(GetProcessHeap(), 0, bmpData2);
}
bmpData2 = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, imgFromOpenCV2->width * imgFromOpenCV2->height * 4);
//iplImageからDIBへ変換
iplTobmp(imgFromOpenCV2, bmpInfo2, bmpData2);
//ここで描画
StretchDIBits(hDC,
15, 20, imgFromOpenCV2->width*1.3, imgFromOpenCV2->height*1.3,
0, 0, imgFromOpenCV2->width, imgFromOpenCV2->height,
bmpData2, &bmpInfo2, DIB_RGB_COLORS, SRCCOPY);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
hwPic = GetDlgItem(hwnd, STATIC_ID0);
hDC = GetDC(hwPic);
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
switch (LOWORD(wp)) {
case BUTTON_ID1:
function1(hwnd);
break;
case BUTTON_ID2://開始
endFlag1 = TRUE;
WaitForSingleObject(threadHandle1, INFINITE);
CloseHandle(threadHandle1);
if (imgFromOpenCV1 != NULL){
HeapFree(GetProcessHeap(), 0, bmpData1);
}
if (threadHandle2 != NULL) {
MessageBox(hwnd, TEXT("DEBUG"), TEXT("スレッド起動エラー"), MB_OK);
//break;
}
function2(hwnd);
break;
case BUTTON_ID3://終了
break;
case BUTTON_ID4:
break;
case BUTTON_ID5:
break;
case BUTTON_ID6:
break;
}
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
//ウィンドウの設定
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("opencv");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("opencv"), TEXT("Training System"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MAXIMIZE,
0, 0, 1350, 800,
NULL, NULL, hInstance, NULL);
CreateWindow(
TEXT("STATIC"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_BITMAP ,
0, 0, 870, 660,
hwnd, (HMENU)STATIC_ID0, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("WebCamera start-up"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
900, 80, 250, 50,
hwnd, (HMENU)BUTTON_ID1, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Sample display"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
900, 400, 150, 50,
hwnd, (HMENU)BUTTON_ID2, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Sample Exit"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1170, 400, 150, 50,
hwnd, (HMENU)BUTTON_ID3, hInstance, NULL);
CreateWindow(
TEXT("STATIC"), TEXT("Select Level"),
WS_CHILD | WS_VISIBLE | WS_BORDER ,
880, 220, 450, 100,
hwnd, NULL, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Beginner"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
900, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID4, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Intermediate"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
1050, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID5, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Advanced"),
WS_CHILD | WS_BORDER | WS_VISIBLE | BS_AUTORADIOBUTTON,
1200, 250, 120, 50,
hwnd, (HMENU)BUTTON_ID6, hInstance, NULL);
CreateWindow(
TEXT("BUTTON"), TEXT("Judge"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
1200, 500, 120, 50,
hwnd, (HMENU)BUTTON_ID7, hInstance, NULL);
if (hwnd == NULL) return -1;
while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}
[/code]