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

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

ただいまの
回答率

87.79%

opencv4のmatchTemplateでプログラム再生時にエラーが発生する(c++)(VS2015)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,375

score 2

前提・実現したいこと

opencv4.1とvisualstudio2015を使用してテンプレートマッチングを行いたいです。(c言語)

発生している問題・エラーメッセージ

コンパイルが通ってしまいます。
プログラムを再生するとmatchTemplateでエラーが発生する。

該当のソースコード

#include <stdio.h>
#include <DxLib.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <string>
#include <windows.h>
#include <tchar.h>
#include <locale.h>
#include <atlstr.h>
#include "C:\opencv\build\include\opencv2\opencv.hpp"
//↑highgui.hppとimgproc.hppが含まれています

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    opencvtest05();
}

int opencvtest05(void)    //
{
    //PCのスクリーンを読み込む
    cv::Mat screen_image = opencvtest04().clone();
    cv::imwrite("abcde.png", screen_image);    //フレーム画像を保存する.
    cv::namedWindow("test1");
    cv::imshow("test1", screen_image);

    //グレイ化
    //cv::Mat gray_image;
    //cvtColor(screen_image, gray_image, cv::COLOR_BGR2GRAY);
    //cv::namedWindow("test2");
    //cv::imshow("test2", gray_image);

    //テンプレートを読み込む
    cv::Mat temp_image = cv::imread("abc.PNG");
    cv::namedWindow("test3");
    cv::imshow("test3", temp_image);

    //テンプレートマッチング
    cv::Mat result_image;
    cv::matchTemplate(screen_image, temp_image, result_image, cv::TM_CCORR_NORMED);

    //マッチした点の座標を求める
    //cv::Point maxPoint;
    //double maxVal;
    //minMaxLoc(result_image, NULL, &maxVal, NULL, &maxPoint, cv::Mat());
    //double threshould_bar = 0.85;    //スレッショルド
    //if (maxVal > threshould_bar)
    //{
    //    cv::rectangle(screen_image, maxPoint, cv::Point(maxPoint.x + temp_image.cols, maxPoint.y + temp_image.rows),cv::Scalar(0,255,255) ,2 ,8 ,0 );
    //}
    //cv::namedWindow("test");
    //cv::imshow("test", screen_image);

    return 0;
}

試したこと

イメージ説明
↑エラーの出ている画像

http://ishidate.my.coocan.jp/opencv_12/opencv_12.htm
のサイトのコードほぼそのままです。

cv::matchTemplateの行を飛ばすと画面のスクショ(1920x1080px,ビットの深さ32)とテンプレート画像(153x132px,ビットの深さ32)が表示されるため、
画像の読み込みは成功していると思われる。

cv::Mat screen_image = opencvtest04().clone();を
cv::imreadで読み込むようにしても、コンパイルが通り再生時にmatchTemplateで失敗する。

cv::TM_CCORR_NORMEDをCV_TM_CCORR_NORMEDにするとコンパイルエラーとなる。(識別子が定義されていません)
cv::matchTemplateをmatchTemplateにしても再生時に引っかかる。

コードのコメントアウトしている部分を解除してもコンパイルは通るが、再生時にmatchTemplateで引っかかる。

補足情報(FW/ツールのバージョンなど)

x64のReleaseでビルド
opencvのバージョンは4.1
使用pcはwindows10

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • tiitoi

    2019/08/14 19:06

    OpenCV の関数に与えた引数が適切なものでないために例外が発生しています。
    例えば、入力画像よりテンプレート画像のほうが大きかったりしないでしょうか?

    キャンセル

  • tiitoi

    2019/08/14 19:09

    以下を確認してみてください
    ・入力画像がテンプレート画像より大きいこと
    ・入力画像、テンプレート画像の型やチャンネル数が一致していること。

    キャンセル

  • minmisan

    2019/08/14 20:10

    type()やdepth()で要素の型、型のバイト数、チャンネル数を調べてみると
    入力画像とテンプレート画像で一致しないことが確認できました。
    とても助かりました。ありがとうございます。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る