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

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Q&A

解決済

2回答

5387閲覧

c++でパーティクルフィルターの実装

minimize

総合スコア23

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

0グッド

0クリップ

投稿2018/12/12 03:54

編集2018/12/12 03:55

c++でパーティクルフィルターの実装をしたいとおもっています。
現在アクティブウィンドウを取得して、Matを取得しています。
これを用いてパーティクルフィルターを使って物体の追従をしたいので、
よさそうなサイトを教えてください。
よろしくお願いいたします。

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#include "opencv2/opencv.hpp" 7 8 9#include <windows.h> 10 11 12using namespace cv; 13using namespace std; 14 15 16BITMAPINFOHEADER CreateBITMAPINFOHEADER(int width, int height) 17{ 18 BITMAPINFOHEADER bi; 19 bi.biSize = sizeof(BITMAPINFOHEADER); 20 bi.biWidth = width; 21 bi.biHeight = -height; 22 bi.biPlanes = 1; 23 bi.biBitCount = 32; 24 bi.biCompression = BI_RGB; 25 bi.biSizeImage = 0; 26 bi.biXPelsPerMeter = 0; 27 bi.biYPelsPerMeter = 0; 28 bi.biClrUsed = 0; 29 bi.biClrImportant = 0; 30 31 return bi; 32} 33 34Mat ConvertHWNDToMat(HWND hwnd) 35{ 36 RECT rect; 37 GetClientRect(hwnd, &rect); 38 int width = rect.right - rect.left; 39 int height = rect.bottom - rect.top; 40 HDC g_hdc = GetDC(hwnd); 41 42 BITMAPINFOHEADER bi = CreateBITMAPINFOHEADER(width, height); 43 LPDWORD lpPixel; 44 45 HBITMAP hbmp = CreateDIBSection(g_hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0); 46 47 HDC hdc = CreateCompatibleDC(g_hdc); 48 SelectObject(hdc, hbmp); 49 BitBlt(hdc, 0, 0, width, height, g_hdc, 0, 0, SRCCOPY); 50 ReleaseDC(hwnd, g_hdc); 51 52 Mat mat(height, width, CV_8UC4, Scalar::all(0)); 53 //mat.data = (uchar*)lpPixel; 54 const int channel = 4; 55 memcpy(mat.data, lpPixel, (sizeof(char) * (width * height) * channel)); 56 57 //DeleteDC(hdc); 58 //DeleteObject(hbmp); 59 //DeleteDC(g_hdc); 60 //ReleaseDC(g_hdc); 61 62 return mat; 63} 64 65 66 67void Error_message(int error_num) { 68 69 switch (error_num){ 70 71 case 0: //Not Mat 72 73 cout << "Not Mat" << endl; 74 75 break; 76 77 78 case 1: //Not Active window 79 80 cout << "Not active window" << endl; 81 82 break; 83 84 case 2: 85 86 cout << "Not template image " << endl; 87 88 break; 89 90 91 default: 92 break; 93 94 } 95 96} 97 98 99int Pursuit(Mat img, Mat temp_img) { // target pursuit 100 101 //ここに実装する予定です 102 103 return 0; 104} 105 106int DoGetActiveWindow(Mat temp_img) { 107 108 char buf[1000]; 109 HWND activeWindow; 110 111 activeWindow = GetForegroundWindow(); //Get active window 112 113 GetWindowText(activeWindow, buf, 1000); //Get active window text 114 115 LPARAM param = (LPARAM)"ResearchProject2"; //Want to open project name 116 117 if (strcmp(buf, (char*)param) == 0) { //Match project name 118 119 Mat mat_img = ConvertHWNDToMat(activeWindow); 120 121 if (mat_img.empty()) { 122 Error_message(0); 123 return 0; 124 } 125 126 127 int img_s = Pursuit(mat_img, temp_img); //target pursuit 128 129 if (img_s != 0) { 130 Error_message(1); // 131 return 0; 132 } 133 134 return 1; 135 136 }else{ 137 return 0; 138 } 139 140 if (activeWindow == NULL) { 141 Error_message(1); 142 return 0; 143 } 144 145 return 0; 146 147} 148 149 150int main() { 151 152 Mat temp_img; 153 154 temp_img = imread("C:\Users\mimimize\Pictures\Saved Pictures\ball.jpg", IMREAD_UNCHANGED); 155 156 STARTUPINFO tStartupInfo = { 0 }; 157 PROCESS_INFORMATION tProcessInfomation = { 0 }; 158 GetStartupInfo(&tStartupInfo); 159 160 CreateProcess( 161 "C:\Users\mimimize\Desktop\c\ResearchProject2.exe", // Name of executable module 162 NULL, // Comand line texts 163 NULL, // Security descriptor 164 NULL, // Security descriptor 165 FALSE, // Handle inheritance option 166 0, // Create flag 167 NULL, // New environmental block 168 NULL, // Name of current directory 169 &tStartupInfo, // Startup information 170 &tProcessInfomation // Process information 171 ); 172 173 Sleep(3000); 174 175 while (1) { 176 int win = DoGetActiveWindow(temp_img); 177 178 if (win != 1) { 179 //Error_message(1); 180 }else { 181 //std::cout << "OKOK" << std::endl; 182 } 183 184 if (waitKey(1) == 1) break; //push anything key 185 186 187 } 188 189 return 0; 190 191}

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

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

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

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

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

guest

回答2

0

BITMAPINFOHEADER CreateBITMAPINFOHEADER(int width, int height)

{
BITMAPINFOHEADER bi;
...
return bi;
}

ローカル変数はその関数を抜けると開放されますんで、関数の戻り値にはできません

ちと修正。
構造体を返すより、引数にポインタを取るようにして、それを操作するようにしましょう

投稿2018/12/12 03:59

編集2018/12/12 04:03
y_waiwai

総合スコア87719

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

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

LouiS0616

2018/12/12 04:40

コンパイラが充分新しいものであればRVOが効く場面かと思います。
guest

0

ベストアンサー

「よさそうなサイト」の基準がよくわからなかったので、個人的にわかりやすかったサイトです。
python + numpyで緑色の物体を追跡する (パーティクルフィルタ)

プログラム自体はpythonで書かれていますが、OpenCVが使用されているので関数名等で調べれば同じようなものが作れるかと思います。
上記のサイトでは、尤度を色情報(緑色)で設定されていますが、ご自身で尤度関数を設定されている場合にはそちらに置き換えれば良いかと思います。

投稿2018/12/15 05:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

minimize

2018/12/18 02:36

ありがとうございます。とりあえずそれをみながら書いていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問