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

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

ただいまの
回答率

90.49%

  • C++

    4510questions

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

  • Visual Studio

    2416questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • OpenCV

    1556questions

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

visual studio2017でimreadが読み込めない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 440

minimize

score 11

質問失礼します。
Visual Studio2017でc++のコードを書いています。
OpenCVを使ってテンプレートマッチングをしようとしたのですが、
テンプレート画像をimreadで読み込もうとしたときに
エラーが出てしまい、画像を読み込むことができません。
コードは以下のようになっています。

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "iostream"
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"

#include <windows.h>


using namespace cv;
using namespace std;


BITMAPINFOHEADER CreateBITMAPINFOHEADER(int width, int height)
{
    BITMAPINFOHEADER bi;
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = width;
    bi.biHeight = -height;
    bi.biPlanes = 1;
    bi.biBitCount = 32;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;

    return bi;
}

Mat ConvertHWNDToMat(HWND hwnd)
{
    RECT rect;
    GetClientRect(hwnd, &rect);
    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;
    HDC g_hdc = GetDC(hwnd);

    BITMAPINFOHEADER bi = CreateBITMAPINFOHEADER(width, height);
    LPDWORD lpPixel;

    HBITMAP hbmp = CreateDIBSection(g_hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);

    HDC hdc = CreateCompatibleDC(g_hdc);
    SelectObject(hdc, hbmp);
    BitBlt(hdc, 0, 0, width, height, g_hdc, 0, 0, SRCCOPY);
    ReleaseDC(hwnd, g_hdc);

    Mat mat(height, width, CV_8UC4, Scalar::all(0));

    const int channel = 4;
    memcpy(mat.data, lpPixel, (sizeof(char) * (width * height) * channel));


    return mat;
}


void Error_message(int error_num) {

    switch (error_num){

    case 0:  //Not Mat

        cout << "Not Mat" << endl;

        break;


    case 1:  //Not Active window

        cout << "Not active window" << endl;

        break;

    case 2:

        cout << "Not template image " << endl;

        break;


    default:
        break;

    }

}


void Pursuit(Mat img) {  // target pursuit 

    Mat temp_img, result;

    temp_img = imread("C:\\Users\\minimize\\Pictures\\Saved Pictures\\ball.jpg"); //Releaseの時のエラーが出る位置

    if (!temp_img.data) Error_message(2);

    matchTemplate(img, temp_img, result, TM_CCORR_NORMED); //Debugの時のエラーが出る位置

    Point temp_position;
    minMaxLoc(result, 0, 0, 0, &temp_position);
    rectangle(img, temp_position, Point(temp_position.x + temp_img.cols,
        temp_position.y + temp_img.rows), Scalar(0, 255, 255), 2, 8, 0);

    imshow("Mat", img);

}

int DoGetActiveWindow() {

    char buf[1000];
    HWND activeWindow;

    activeWindow = GetForegroundWindow();        //Get active window

    GetWindowText(activeWindow, buf, 1000);        //Get active window text 

    LPARAM param = (LPARAM)"ResearchProject2";  //Want to open project name

    if (strcmp(buf, (char*)param) == 0) {        //Match project name 

        //HBITMAP bmp = GetBitmap(activeWindow);
        Mat mat_img = ConvertHWNDToMat(activeWindow);

        if (mat_img.empty()) {
            Error_message(0);
            return 0;
        }

        Pursuit(mat_img);   //target pursuit

        return 1;
    }else{
        return 0;
    }

    if (activeWindow == NULL) {
        Error_message(1);
        return 0;
    }

    return 0;

}


int main() {

    STARTUPINFO tStartupInfo = { 0 };
    PROCESS_INFORMATION tProcessInfomation = { 0 };
    GetStartupInfo(&tStartupInfo);

    CreateProcess(
        "C:\\Users\\mizuho\\Desktop\\sotuken\\ResearchProject2.exe", // Name of executable module
        NULL,    // Comand line texts
        NULL,    // Security descriptor
        NULL,    // Security descriptor
        FALSE,    // Handle inheritance option
        0,        // Create flag
        NULL,    // New environmental block
        NULL,    // Name of current directory
        &tStartupInfo,        //    Startup information
        &tProcessInfomation //    Process information
    );

    Sleep(1000);

    while (1) {
        int win = DoGetActiveWindow();

        if (win != 1) {
            //Error_message(1);
        }else {
            //std::cout << "OKOK" << std::endl;
        }

        if (waitKey(0) == 1) break;  //push anything key

    }

    return 0;

}


ソリューション構成はRelease
ソリューションプラットフォームは×64

エラーの内容は
「例外がスローされました。0×00007FFE3A0260DB(ucrtbased.dll)で例外がスローされました。(Conndole.exe内): 0xC0000005: 場所 0xFFFFFFFFFFFFFFFFの読み取り中にアクセス違反が発生しました」
になります。

イメージ説明

rem.jpgはこのディレクトリにあることを確認しました。

ソリューション構成 Debug
ソリューションプラットフォーム x64
の場合のエラーも載せておきます。

Releaseの時と違うのは、コンソールに

OpenCV(4.0.0-rc) Error: Assertion failed ((depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2) in cv::matchTemplate, file c:\build\master_winpack-build-win64-vc15\opencv\modules\imgproc\src\templmatch.cpp, line 1107

というエラーが出てきたことと、
以下の画像のエラーメッセージになりました。
イメージ説明

このエラーの解決方法をわかる方がいれば、教えてください。
また、解決する際に必要な情報がほかにありましたら教えてください。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kazto

    2018/11/24 16:37

    エラーの内容はアクセス違反を示しており、質問者様が示した行とは無関係に見受けられます。公開できる範囲でなるべく漏らさず、ソースコードと、エラーメッセージの全てを追記お願いします。

    キャンセル

  • minimize

    2018/11/24 17:31

    ご指摘ありがとうございます。今全部のソースコードとエラーメッセージの画像を追加しました。このほかに必要そうな情報はありますでしょうか?

    キャンセル

  • kazto

    2018/11/24 18:17

    Debugビルドして実行することは可能でしょうか。もう少し原因が絞り込みやすくなると思います。

    キャンセル

  • minimize

    2018/11/25 12:24

    遅くなってしまい申し訳ございません。昨日は実行できなかったので、本日になってしまいました。Debugビルドのエラーを追加しました。よろしくお願いいたします。

    キャンセル

回答 1

checkベストアンサー

+1

http://opencv.jp/opencv-2svn/cpp/imgproc_object_detection.html

matchTemplateに渡す画像は1chのものに限られます。
Pursuit関数内でimg、temp_imgをそれぞれcvtColorで変換する必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/25 17:01

    ありがとうございました!!変更してみたところ、表示できました!
    助かりました!!!

    キャンセル

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

  • C++

    4510questions

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

  • Visual Studio

    2416questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • OpenCV

    1556questions

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