トップページ > 記事閲覧
BASEIMAGEからOpenCVのcv::Matへの変換
名前:名無三 日時: 2025/03/04 22:53

お疲れ様です。 すいません、OpenCVにてデスクトップ画像からmatchTemplateを用いて画像識別をさせようと思いBASEIMAGEとcv::Matとの相互変換を行おうと思うのですが、 BASEIMAGEからcv::Matへの変換方法が思い至りません… こちら御存じでしたらご教示いただけますと幸いです。 以下、現状行おうとしている内容です。(よくよく考えればopencv上でデスクトップ画面を取ってそれで対応も手ですね…) //ウィンドウ画面キャプチャ GetDesktopScreenBaseImage(0, 0, DispXSize, DispYSize, &DesktopImage, 0, 0); ReCreateGraphFromBaseImage(&DesktopImage, GrHandle); //ウィンドウ画像の割り当て(ここが未解決) image.data = (uchar*)DesktopImage.GraphData; image.cols = DesktopImage.Width; image.rows = DesktopImage.Height; image.step = DesktopImage.Pitch; //マッチ検出(上記ではエラー) cv::matchTemplate(image, checkimage, resultimage, cv::TM_CCOEFF_NORMED); cv::Point max_pt; double maxVal; cv::minMaxLoc(resultimage, NULL, &maxVal, NULL, &max_pt); //結果発表 if (maxVal > 0.99) { printfDx("AAAA\n"); }
メンテ

Page: 1 |

Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.1 )
名前:管理人 日時:2025/03/04 23:22

DesktopImage は BASEIMAGE構造体だと思いますが、こちらはどのように初期化されていますでしょうか? カラーフォーマットが OpenCV が想定するフォーマットと異なってしまっているかもしれません( RGB の順番など )
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.2 )
名前:名無三 日時:2025/03/05 09:07

ありがとうございます。初期化は以下で行っております image = cv::Mat::zeros(DispXSize, DispYSize, checkimage.type()); checkimage = cv::imread("Test.png", cv::IMREAD_UNCHANGED); CreateRGBA8ColorBaseImage(DispXSize, DispYSize, &DesktopImage); エラーメッセージでは matrix.cpp:1688: error: (-215:Assertion failed) data == datastart + ofs.y*step[0] + ofs.x*esz in function 'cv::Mat::locateROI' となります
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.3 )
名前:名無三(とりあえず解決) 日時:2025/03/05 21:44

とりあえず下記のHwnd2Matを利用してデスクトップ画面を取り、cv側で完結する形としました(テスト表示用にBASEIMAGEを残していますがそれ用だけでいいかもですね) qiita.com/yasunari_matsuo/items/1dd10e0379570eef96d0 checkimage = cv::imread("Test.png", cv::IMREAD_UNCHANGED); // 空のグラフィックハンドルの値を初期化 GrHandle = MakeScreen(DispXSize, DispYSize, FALSE); memset(&DesktopImage, 0, sizeof(BASEIMAGE)); // BASEIMAGE 構造体を0で初期化 CreateBGR8ColorData(&DesktopImage.ColorData); // カラーフォーマットは変化しないので最初に設定 DesktopImage.MipMapCount = 0; // ミップマップではないので0 //ウィンドウ画面キャプチャ monitor_img = Hwnd2Mat(GetDesktopWindow(), 0, 0, DispXSize, DispYSize); //ウィンドウ画像の割り当て DesktopImage.Width = monitor_img.cols; DesktopImage.Height = monitor_img.rows; DesktopImage.Pitch = (int)monitor_img.step; DesktopImage.GraphData = monitor_img.data; ReCreateGraphFromBaseImage(&DesktopImage, GrHandle); //マッチ検出 cv::matchTemplate(monitor_img, checkimage, resultimage, cv::TM_CCOEFF_NORMED); cv::minMaxLoc(resultimage, NULL, &maxVal, NULL, &max_pt);
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.4 )
名前:管理人(解決) 日時:2025/03/05 21:48

もう解決済みとのことですが > image = cv::Mat::zeros(DispXSize, DispYSize, checkimage.type()); > checkimage = cv::imread("Test.png", cv::IMREAD_UNCHANGED); > CreateRGBA8ColorBaseImage(DispXSize, DispYSize, &DesktopImage); checkimage は 2行目で有効な情報が代入されていると思うのですが、その一つ前の行で checkimage.type() と使用されていると正常な動作が行われないのではないでしょうか? (・・
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.5 )
名前:名無三(解決済) 日時:2025/03/06 17:57

すいません、コピペミスです。元コードではcheckimageがimageの上にありました
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.6 )
名前:管理人(解決済) 日時:2025/03/07 02:09

> すいません、コピペミスです。元コードではcheckimageがimageの上にありました なるほど、そうだったのですね すみません、単純に興味があるだけなのですが、checkimage.type() の戻り値は何でしょうか? こちらのページにある定義のどれかだと思うのですが… <OpenCVのMatのタイプ一覧表> https://tech-blog.s-yoshiki.com/entry/76 因みにDXライブラリの CreateRGBA8ColorBaseImage で作成されるデータは CV_8UC4 に相当すると思います
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.7 )
名前:名無三(解決) 日時:2025/03/07 17:16

そうですね。確認しましたところ、CV_8UC3となっておりました
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.8 )
名前:管理人(解決済) 日時:2025/03/08 04:59

ご確認いただきありがとうございます CV_8UC3 となりますと CreateRGBA8ColorBaseImage の CV_8UC4 相当とは異なりますので、 > image = cv::Mat::zeros(DispXSize, DispYSize, checkimage.type()); > checkimage = cv::imread("Test.png", cv::IMREAD_UNCHANGED); > CreateRGBA8ColorBaseImage(DispXSize, DispYSize, &DesktopImage); こちらの部分の CreateRGBA8ColorBaseImage を CreateRGB8ColorBaseImage にすると エラーが発生しなくなるかもしれません
メンテ
Re: BASEIMAGEからOpenCVのcv::Matへの変換 ( No.9 )
名前:名無三(解決) 日時:2025/03/10 20:53

ありがとうございます、解消できました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存