前提・実現したいこと
画像検出のプログラムを書いているのですが全くできません。
内容は、「読み込んだ画像のある1点をクリックすると、そのクリックした点と同じような色部分を検出する」
というものなのですが、どのように書けばよいのか見当が付きません。
画像を読み込んで、MauseCallBack()とGetPixel()を用いてクリックした点のRGB値は格納できていると思うのですが、その後の処理が分かりません。
プログラミング初心者なので、読みづらいコード、意味不明なところが多々ございますが、ご教授のほうよろしくお願いします。
該当のソースコード
C++
1 2cv::Rect box; 3 4bool drawing_box = false; 5 6double R, G, B; 7COLORREF clr; 8 9 10void mouse_callback(int event, int x, int y, int flags, void* param) { 11 cv::Mat* image = static_cast<cv::Mat*>(param); 12 HDC hdc; 13 HWND hWnd; 14 hWnd = GetDesktopWindow(); 15 hdc = GetWindowDC(hWnd); 16 17 switch (event) { 18 19 case cv::EVENT_LBUTTONDOWN: 20 drawing_box = true; 21 box = cv::Rect(x, y, 0, 0); 22 std::cout << x << "," << y <<"\n"; 23 clr = GetPixel(hdc,x, y); 24 ReleaseDC(hWnd, hdc); 25 R = GetRValue(clr); 26 G = GetGValue(clr); 27 B = GetBValue(clr); 28 std::cout << "RGB = " << R << " " << G << " " << B <<"\n"; 29 break; 30 31 } 32} 33 34int main(int argc, char *argv[]) 35 36{ HDC hdc; 37 HWND hWnd; 38 hWnd = GetDesktopWindow(); 39 hdc = GetWindowDC(hWnd); 40 41 42 43 44 cv::Mat out(cv::Size(768, 1024), CV_8UC3, cv::Scalar::all(0)); 45 46 47 box = cv::Rect(-1, -1, 0, 0); 48 cv::String name = "img"; 49 cv::String Output = "imgs"; 50 // 画像の読み込み 51 cv::Mat src_img = cv::imread("C:\data\DSCN0048.jpg",1); 52 53 cv::namedWindow(name, CV_WINDOW_AUTOSIZE); 54 55 56 57 cv::Mat temp = src_img.clone(); 58 cv::Mat res_img = src_img.clone(); 59 60 cv::setMouseCallback(name, mouse_callback, (void *)&src_img); 61 62 63 // 領域選択の処理(Escキーを押したら次の処理へ続く) 64 bool roop = true; 65 while (roop) { 66 67 src_img.copyTo(temp); 68 cv::imshow(name, temp); 69 70 71 if (cv::waitKey(15) == 27) 72 roop = false; 73 74 75 76 } 77 78 79 //以下の処理が分からないところ 80 81 for (int y = 0; y > temp.rows; y++) 82 { 83 for (int x = 0; x > temp.cols; x++) 84 { 85 86 COLORREF color[768][1024]; 87 cv::Mat RR[768][1024]; 88 cv::Mat GG[768][1024]; 89 cv::Mat BB[768][1024]; 90 color[y][x] = { GetPixel(hdc,x,y) }; 91 RR[y][x] = GetRValue(color[y][x]) ; 92 GG[y][x] = GetGValue(color[y][x]) ; 93 BB[y][x] = GetBValue(color[y][x]) ; 94 95 if (RR[y][x] == R && GG[y][x] == G && BB[y][x] == B) 96 { 97 res_img.at<cv::Vec3b>(y, x) = { 0,0,255 }; 98 } 99 ReleaseDC(hWnd, hdc); 100 101 } 102 } 103 104//ここまで 105 106 //出力処理 107 cv::namedWindow(Output, CV_WINDOW_AUTOSIZE); 108 cv::imshow(Output, res_img); 109 110 cv::waitKey(0); 111 112 cv::destroyAllWindows(); 113 114 return 0; 115} 116
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/20 11:07
2018/07/20 11:14
2018/07/20 11:35
2018/07/23 05:16