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

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

ただいまの
回答率

88.61%

OpenCVで画像データを関数に渡したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,992

sug1t0m0

score 40

メイン関数で読み込んだ画像データを、ヒストグラムデータ作成・出力用の関数に渡したいのですが、関数の中で画像データにアクセスできません。どうにかして1つの関数内で画像データからヒストグラムを作成出力したいのですが良い方法はないでしょうか?

//標準ヘッダーファイルの読み込み
//Read the header in the C standard library
// :: Framework ::
#include <math.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>


//画像の輝度値
#define COLOR_STEPS 256

void SaveHist(IplImage** img_dst, char *hist_name);

//メイン関数
int main( int argc, char **argv ){

    char Hist_name[72] = "name.csv";

    IplImage *Img = cvLoadImage( "name.tif", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );

    if(Img == NULL){
        //画像が見つからなかった場合のエラー処理 if image is not found
        printf("%s not found image!\n","name.tif");
        exit(1);
    }

    SaveHist(&Img, Hist_name);
}

void SaveHist(IplImage** img_dst, char *hist_name){

    int i, x, y;
    unsigned char p[3];

    FILE *fphist;

    int B[COLOR_STEPS];
    int G[COLOR_STEPS];
    int R[COLOR_STEPS];

    for(i=0;i<COLOR_STEPS;i++){
        B[i] = 0;
        G[i] = 0;
        R[i] = 0;
    }

    for (y = 0; y < *img_dst->height; y++) {   // ここがエラーになる
        for (x = 0; x < *img_dst->width; x++){    // ここがエラーになる
            p[0] = *img_dst->imageData[*img_dst->widthStep * y + x * 3 ];    // ここがエラーになる
            p[1] = *img_dst->imageData[*img_dst->widthStep * y + x * 3 + 1 ];    // ここがエラーになる
            p[2] = *img_dst->imageData[*img_dst->widthStep * y + x * 3 + 2 ];    // ここがエラーになる

            for(i = 0;i<COLOR_STEPS;i++){
                if(p[0] == i) B[i]++;
                if(p[1] == i) G[i]++;
                if(p[2] == i) R[i]++;
            }
        }
    }

    if((fphist = fopen(hist_name,"w")) == NULL){
        printf("%s file open error!!\n",hist_name);
        exit(1);
    }

    for(i = 0;i<COLOR_STEPS;i++){
        fprintf(fphist,"%d, %d, %d\n",B[i],G[i],R[i]);
    }
    fclose(fphist);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

こんにちは。

これはC言語の演算子の優先順位の問題です。

*->では->の方が優先順位が高いので、*img_dst->heightと記述すると、まずimg_dst->heightのように解釈されます。img_dstIplImage*へのポインタですから、img_dst->IplImage*を示します。IplImage*にはheightメンバはありませんので、エラーになるのです。
(*img_dst)->heightと書けば良いはずです。

しかし、元がポインタですので、単純にvoid SaveHist(IplImage* img_dst, char *hist_name)とした方が話は単純です。(またまた混乱するかも知れませんので、一度上記で成功してからトライするか、そもそもトライしない方が良いと思いますが。)

もしも、SaveHist()内でcvLoadImage()を呼んで、それが返したIplImage*を呼び出し元へ返したいような時は、2重ポインタにすることもあります。(ポインタの値を返却するので、ポインタへのポインタを渡す。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/13 17:09

    演算子の優先度の問題だったんですね!四則演算の時は演算子の優先度を意識するのですが、上記のような演算子にも優先度があるとは思いませんでした。ありがとうございます。

    キャンセル

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

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

関連した質問

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