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

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

ただいまの
回答率

90.12%

OpenCVでのエラー(ヒストグラム)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,515

iisa

score 16

OpenCVでヒストグラムを表示させるプログラムでエラーがでたので教えてください。
本の通りに

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <string>
#include <cmath>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
string win_src = "src";
string win_dst = "dst";
int main()
{
       string file_src = "picture1.png";//入力画像のファイル名
       string file_dst = "picture2.png";//出力画像のファイル名
       Mat img_src = imread(file_src, 1);//入力画像(カラー)の読み込み
       //Mat img_src=imread(file_src,0) //入力画像(グレー)の読み込み
       Mat img_dst;
       if (!img_src.data){
              cout << "error" << endl;
              return -1;
              }
       //ウインドウ生成
       namedWindow(win_src, WINDOW_AUTOSIZE);
       namedWindow(win_src, WINDOW_AUTOSIZE);
       //ここに核となる処理を記述する
       //ヒストグラム表示用、256*100ピクセル、0(黒)で初期化
       Mat img_hst;
       img_hst = Mat::zeros(100, 256, CV_8UC1);
       const int hdims[] = { 256 };
       const float hranges[] = { 0,256 };
       const float*ranges[] = { hranges };
       //1チャンネル画像の度数分布を計算
       Mat hist;
       int channels[] = { 0 };
       calcHist(&img_src, 1, channels, Mat(), hist, 1, hdims, ranges);
       //度数の最大値を取得
       double hist_min, hist_max;
       minMaxLoc(hist, &hist_min, &hist_max);
       //ヒストグラムを白線で描画
       for (int i = 0; i <= 255; i++) {
              int v = saturate_cast<int>(hist.at<float>(i));
              cout << i << " " << v << endl;
              line(img_hst, Point(i,img_hst.rows), Point(i, img_hst.rows - img_hst.rows*(v / hist_max)), Scalar(255, 255, 255));
       }
       //核以上
       imshow(win_src, img_src);//入力画像を表示
       imshow(win_dst, img_dst);//出力画像を表示
       imwrite(file_dst, img_dst);//処理結果の保存

       system("pause");//キー入力待ち
       return 0;
}


でデバックすると、後ろから3行目

imshow(win_dst, img_dst);//出力画像を表示


でエラーが出ました。他のopenCVのプログラムではここはエラーが出なかったので、このプログラム特有のエラーと考え、今回は「出力画像」がないのにそれを表示させようとしたからエラーがでたと結論付けました。そこでここを削って再度デバックすると、コマンドプロントにエラー?がでました。
数字がバーッとならんで、最後に下のようなエラーです。
250 502
251 371
252 235
253 137
254 91
255 151
libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data
(続行するには何かキーを押して下さい)

image width/heightとあるので出力画像のことかなと思いました。しかし先ほど削った「出力画像を表示」させるところはエラーが出るので、どうしたらよいのかわかりません。教えて頂けないでしょうか。

環境:VS community 2017
windows10(64)
c++
プログラミング初心者なので、よければこういうエラーではこう検索すれば出てくるみたいなことがあれば、こちらもお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

こんにちは。

img_dstではなくimg_hstを指定するべきなのでは?

誤> imshow(win_dst, img_dst);//出力画像を表示
正> imshow(win_dst, img_hst);//出力画像を表示

同様に下記もミスしているような印象です。

誤> imwrite(file_dst, img_dst);//処理結果の保存
正> imwrite(file_dst, img_hst);//処理結果の保存

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/12 16:41

    ありがとうございます!無事できました。
    しっかりとimshowとimwriteの構文が分かっていませんでした。(コピペの弊害ですね)
    Chironian様、またのご教授よろしくお願いいたします。

    キャンセル

+1

そもそも、変数img_dstは定義時にデフォルト初期化された後一度も書き込み操作を行っていないように思うんですが、ソースコードを省略していませんか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/12 16:44

    ご回答ありがとうございます。
    img_dstでなくimg_hstを今回はいじったので、おっしゃる通りimg_dstは書き込み操作をしていません。
    imshowとimwriteの構文の勉強不足だったようです。
    yumetodo様も問題の解決に協力して頂きありがとうございます。
    またのご教授よろしくお願いします。

    キャンセル

  • 2018/02/13 21:04

    やっぱりimg_hstだったか・・・

    キャンセル

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

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

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