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
ありがとうございます、解消できました!
|