質問です。
c++でUnityで作った実行ファイルを実行して、
フォアグラウンドウィンドウを取得しています。
そのウィンドウをbitmapに変更することはできたと思うのですが、
OpenCvでそのbitmapをいじりたいので
Mat形式に変換する方法を教えてください。
やりたいことは、実行ファイルをリアルタイムにウィンドウキャプチャして、
ウィンドウキャプチャした画像をOpenCVで処理(テンプレートマッチングをして、オブジェクトをリアルタイムに追跡)して、その処理した画像をつなげた動画を表示したいと思っています。
わかりにくいところがありましたら、質問していただけると幸いです。
それと、最初に書いたときは時間がなくてちょっとしか情報が載せられなかったことを
謝罪します。
コードが長くなっていますが、よろしくお願いいたします。
C++
1#include <opencv2/opencv.hpp> 2#include "opencv2/highgui/highgui.hpp" 3#include "iostream" 4#include "opencv2/core/core.hpp" 5#include "opencv2/features2d/features2d.hpp" 6 7#include <windows.h> 8 9 10using namespace cv; 11using namespace std; 12 13 14HBITMAP GetBitmap(HWND hwnd) { 15 RECT rec; 16 GetClientRect(hwnd, &rec); //Return window coordinate(upper left, bottom right) 17 float width = rec.right - rec.left; //window widht 18 auto height = rec.bottom - rec.top; //window height 19 20 auto hdcSrc = GetDC(NULL); //Return desplay handle 21 auto hdcDst = CreateCompatibleDC(hdcSrc); // instance memori device context 22 HBITMAP hbmp = CreateCompatibleBitmap(hdcSrc, width, height); 23 auto hOldBmp = SelectObject(hdcDst, hbmp); // Set bitmap in memory device context 24 25 BitBlt(hdcDst, // Copy color data 26 0, 0, width, height, 27 hdcSrc, 28 rec.left, rec.top, 29 SRCCOPY 30 ); 31 32 SelectObject(hdcDst, hOldBmp); 33 DeleteDC(hdcDst); 34 ReleaseDC(hwnd, hdcSrc); 35 36 return hbmp; 37} 38 39void error_message(int error_num) { 40 41 switch (error_num){ 42 43 case 0: //Not Bmp 44 45 std::cout << "not bmp" << std::endl; 46 47 break; 48 49 50 case 1: //Not Active window 51 52 std::cout << "Not active window" << std::endl; 53 54 break; 55 56 case 2: 57 58 break; 59 60 61 default: 62 break; 63 64 } 65 66} 67 68int DoGetActiveWindow() { 69 70 char buf[1000]; 71 HWND activeWindow; 72 73 activeWindow = GetForegroundWindow(); //Get active window 74 75 GetWindowText(activeWindow, buf, 1000); //Get active window text 76 77 LPARAM param = (LPARAM)"ResearchProject2"; //Want to open project name 78 79 if (strcmp(buf, (char*)param) == 0) { //Match project name 80 81 HBITMAP bmp = GetBitmap(activeWindow); 82 83 if (bmp == NULL) { 84 error_message(0); 85 return 0; 86 } 87 88 return 1; 89 }else{ 90 return 0; 91 } 92 93 if (activeWindow == NULL) { 94 error_message(1); 95 return 0; 96 } 97 98 return 0; 99 100} 101 102int main() { 103 104 STARTUPINFO tStartupInfo = { 0 }; 105 PROCESS_INFORMATION tProcessInfomation = { 0 }; 106 GetStartupInfo(&tStartupInfo); 107 108 CreateProcess( 109 "C:\\ResearchProject2.exe", 110 NULL, // Comand line texts 111 NULL, // Security descriptor 112 NULL, // Security descriptor 113 FALSE, // Handle inheritance option 114 0, // Create flag 115 NULL, // New environmental block 116 NULL, // Name of current directory 117 &tStartupInfo, // Startup information 118 &tProcessInfomation // Process information 119 ); 120 121 Sleep(1000); 122 123 while (1) { 124 int win = DoGetActiveWindow(); 125 126 if (win != 1) { 127 error_message(1); 128 }else { 129 std::cout << "OKOK" << std::endl; 130 } 131 132 if (waitKey(0) == 1) break; //push anything key 133 134 } 135 136 return 0; 137 138}
matという画像形式(フォーマット)について説明しているページを追記ください。
OpenCVのMat形式です。 http://opencv.jp/cookbook/opencv_mat.html
追記ありがとうございます。ファイル保存フォーマット(形式)を明記ください。
map形式は、ただの配列なので、そんなに難しくない。bitmapもpixcel毎にデータ取得すると異常に遅いが、Mapしてアクセスすると、難しくない。細かな手順忘れたので、思い出したら、書いてみます。
縦横方向の並び順、パディングの有無、チャンネル数、色深度とか、もしかして記録する仕様あるのかな?と。
おそくなってしまってすみません。やりたいことは、実行ファイルをリアルタイムにウィンドウキャプチャして、キャプチャした画像をOpenCVで画像処理をして、最終的には動画にしたいと思っています。その際にMat形式にしたいと考えています。私が少し勘違いをしていたのですが、ファイルに画像は保存したくなくて、pngかjpgの形式にだけできるのかとおもっていたのですけどできない?みたいなので、いまはmat変換できるかを考えています。
回答2件
あなたの回答
tips
プレビュー