質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2343閲覧

Bitmapを変換する方法

minimize

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/22 11:38

編集2018/11/23 07:42

質問です。
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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/11/22 11:43

matという画像形式(フォーマット)について説明しているページを追記ください。
can110

2018/11/22 11:50

追記ありがとうございます。ファイル保存フォーマット(形式)を明記ください。
pepperleaf

2018/11/22 12:03

map形式は、ただの配列なので、そんなに難しくない。bitmapもpixcel毎にデータ取得すると異常に遅いが、Mapしてアクセスすると、難しくない。細かな手順忘れたので、思い出したら、書いてみます。
can110

2018/11/22 12:13

縦横方向の並び順、パディングの有無、チャンネル数、色深度とか、もしかして記録する仕様あるのかな?と。
minimize

2018/11/23 07:37

おそくなってしまってすみません。やりたいことは、実行ファイルをリアルタイムにウィンドウキャプチャして、キャプチャした画像をOpenCVで画像処理をして、最終的には動画にしたいと思っています。その際にMat形式にしたいと考えています。私が少し勘違いをしていたのですが、ファイルに画像は保存したくなくて、pngかjpgの形式にだけできるのかとおもっていたのですけどできない?みたいなので、いまはmat変換できるかを考えています。
guest

回答2

0

こんな感じで変更することによって変換することができました・・。
お騒がせいたしました。
答えてくださった方、話を聞いてくださった方、本当にありがとうございました。
最初に回答してくださった方をベストアンサーにしておきます

BITMAPINFOHEADER bi = CreateBITMAPINFOHEADER(width, height); LPDWORD lpPixel; HBITMAP hbmp = CreateDIBSection(g_hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0); HDC hdc = CreateCompatibleDC(g_hdc); SelectObject(hdc, hbmp); BitBlt(hdc, 0, 0, width, height, g_hdc, 0, 0, SRCCOPY); ReleaseDC(hwnd, g_hdc); Mat mat(height, width, CV_8UC4, Scalar::all(0)); //mat.data = (uchar*)lpPixel; const int channel = 4; memcpy(mat.data, lpPixel, (sizeof(char) * (width * height) * channel));

投稿2018/11/23 11:35

minimize

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

GDI+でどうぞ。

投稿2018/11/22 11:45

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問