質問編集履歴

2

文章の変更と、内容の追加

2018/11/23 07:42

投稿

minimize
minimize

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ 質問です。
2
+
1
3
  c++でUnityで作った実行ファイルを実行して、
2
4
 
3
5
  フォアグラウンドウィンドウを取得しています。
@@ -6,7 +8,23 @@
6
8
 
7
9
  OpenCvでそのbitmapをいじりたいので
8
10
 
9
- pngかjpgかmat形式に変換する方法を教えてください。
11
+ Mat形式に変換する方法を教えてください。
12
+
13
+
14
+
15
+ やりたいことは、実行ファイルをリアルタイムにウィンドウキャプチャして、
16
+
17
+ ウィンドウキャプチャした画像をOpenCVで処理(テンプレートマッチングをして、オブジェクトをリアルタイムに追跡)して、その処理した画像をつなげた動画を表示したいと思っています。
18
+
19
+
20
+
21
+ わかりにくいところがありましたら、質問していただけると幸いです。
22
+
23
+ それと、最初に書いたときは時間がなくてちょっとしか情報が載せられなかったことを
24
+
25
+ 謝罪します。
26
+
27
+ コードが長くなっていますが、よろしくお願いいたします。
10
28
 
11
29
 
12
30
 

1

文章の追加

2018/11/23 07:42

投稿

minimize
minimize

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,291 @@
1
+ c++でUnityで作った実行ファイルを実行して、
2
+
3
+ フォアグラウンドウィンドウを取得しています。
4
+
5
+ そのウィンドウをbitmapに変更することはできたと思うのですが、
6
+
7
+ OpenCvでそのbitmapをいじりたいので
8
+
1
- bitmapをpngかjpgかmat形式に変換する方法を教えてください。
9
+ pngかjpgかmat形式に変換する方法を教えてください。
10
+
11
+
12
+
2
-
13
+ ```C++
14
+
15
+ #include <opencv2/opencv.hpp>
16
+
17
+ #include "opencv2/highgui/highgui.hpp"
18
+
19
+ #include "iostream"
20
+
21
+ #include "opencv2/core/core.hpp"
22
+
23
+ #include "opencv2/features2d/features2d.hpp"
24
+
25
+
26
+
27
+ #include <windows.h>
28
+
29
+
30
+
31
+
32
+
33
+ using namespace cv;
34
+
35
+ using namespace std;
36
+
37
+
38
+
39
+
40
+
41
+ HBITMAP GetBitmap(HWND hwnd) {
42
+
43
+ RECT rec;
44
+
45
+ GetClientRect(hwnd, &rec); //Return window coordinate(upper left, bottom right)
46
+
47
+ float width = rec.right - rec.left; //window widht
48
+
49
+ auto height = rec.bottom - rec.top; //window height
50
+
51
+
52
+
53
+ auto hdcSrc = GetDC(NULL); //Return desplay handle
54
+
55
+ auto hdcDst = CreateCompatibleDC(hdcSrc); // instance memori device context
56
+
57
+ HBITMAP hbmp = CreateCompatibleBitmap(hdcSrc, width, height);
58
+
59
+ auto hOldBmp = SelectObject(hdcDst, hbmp); // Set bitmap in memory device context
60
+
61
+
62
+
63
+ BitBlt(hdcDst, // Copy color data
64
+
65
+ 0, 0, width, height,
66
+
67
+ hdcSrc,
68
+
69
+ rec.left, rec.top,
70
+
71
+ SRCCOPY
72
+
73
+ );
74
+
75
+
76
+
77
+ SelectObject(hdcDst, hOldBmp);
78
+
79
+ DeleteDC(hdcDst);
80
+
81
+ ReleaseDC(hwnd, hdcSrc);
82
+
83
+
84
+
85
+ return hbmp;
86
+
87
+ }
88
+
89
+
90
+
91
+ void error_message(int error_num) {
92
+
93
+
94
+
95
+ switch (error_num){
96
+
97
+
98
+
99
+ case 0: //Not Bmp
100
+
101
+
102
+
103
+ std::cout << "not bmp" << std::endl;
104
+
105
+
106
+
107
+ break;
108
+
109
+
110
+
111
+
112
+
113
+ case 1: //Not Active window
114
+
115
+
116
+
117
+ std::cout << "Not active window" << std::endl;
118
+
119
+
120
+
121
+ break;
122
+
123
+
124
+
125
+ case 2:
126
+
127
+
128
+
129
+ break;
130
+
131
+
132
+
133
+
134
+
135
+ default:
136
+
137
+ break;
138
+
139
+
140
+
141
+ }
142
+
143
+
144
+
145
+ }
146
+
147
+
148
+
149
+ int DoGetActiveWindow() {
150
+
151
+
152
+
153
+ char buf[1000];
154
+
155
+ HWND activeWindow;
156
+
157
+
158
+
159
+ activeWindow = GetForegroundWindow(); //Get active window
160
+
161
+
162
+
163
+ GetWindowText(activeWindow, buf, 1000); //Get active window text
164
+
165
+
166
+
167
+ LPARAM param = (LPARAM)"ResearchProject2"; //Want to open project name
168
+
169
+
170
+
171
+ if (strcmp(buf, (char*)param) == 0) { //Match project name
172
+
173
+
174
+
175
+ HBITMAP bmp = GetBitmap(activeWindow);
176
+
177
+
178
+
179
+ if (bmp == NULL) {
180
+
181
+ error_message(0);
182
+
183
+ return 0;
184
+
185
+ }
186
+
187
+
188
+
189
+ return 1;
190
+
191
+ }else{
192
+
193
+ return 0;
194
+
195
+ }
196
+
197
+
198
+
199
+ if (activeWindow == NULL) {
200
+
201
+ error_message(1);
202
+
203
+ return 0;
204
+
205
+ }
206
+
207
+
208
+
209
+ return 0;
210
+
211
+
212
+
213
+ }
214
+
215
+
216
+
217
+ int main() {
218
+
219
+
220
+
221
+ STARTUPINFO tStartupInfo = { 0 };
222
+
223
+ PROCESS_INFORMATION tProcessInfomation = { 0 };
224
+
225
+ GetStartupInfo(&tStartupInfo);
226
+
227
+
228
+
229
+ CreateProcess(
230
+
231
+ "C:\\ResearchProject2.exe",
232
+
233
+ NULL, // Comand line texts
234
+
235
+ NULL, // Security descriptor
236
+
237
+ NULL, // Security descriptor
238
+
239
+ FALSE, // Handle inheritance option
240
+
241
+ 0, // Create flag
242
+
243
+ NULL, // New environmental block
244
+
245
+ NULL, // Name of current directory
246
+
247
+ &tStartupInfo, // Startup information
248
+
249
+ &tProcessInfomation // Process information
250
+
251
+ );
252
+
253
+
254
+
255
+ Sleep(1000);
256
+
257
+
258
+
3
- C++で書いています。
259
+ while (1) {
260
+
261
+ int win = DoGetActiveWindow();
262
+
263
+
264
+
265
+ if (win != 1) {
266
+
267
+ error_message(1);
268
+
269
+ }else {
270
+
271
+ std::cout << "OKOK" << std::endl;
272
+
273
+ }
274
+
275
+
276
+
277
+ if (waitKey(0) == 1) break; //push anything key
278
+
279
+
280
+
281
+ }
282
+
283
+
284
+
285
+ return 0;
286
+
287
+
288
+
289
+ }
290
+
291
+ ```