OpenCVのIPLimage構造体にヘッダ無しRaw画像を読み込んで表示させたいのですが、OpenCVではヘッダ無しRaw画像を直接読み込む関数がないため(cvLoadImageは対応せず)自作しなければいけません。まだCプログラムを勉強し始めたばかりなのでなかなか上手くいかなくて困っております。どなたか教えていただけませんか?ここまで作っみました。コンパイルはできますが、原画像どおり表示してくれません。扱う画像はレントゲン画像で512*512 32bit実数データです。
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char infile[512]; /* (1) */
float *inputimg; /* (3) */
int i, j;
int mszx, mszy;
FILE *fp;
IplImage* img;
strcpy(infile,argv[1]);
mszx = atoi(argv[2]);
mszy = atoi(argv[3]);
static const char* title="display";
inputimg = (float*)malloc(mszx*mszy*sizeof(float));
if((fp=fopen(infile,"rb")) == NULL) {
printf("OPEN FAILED %s\n",infile);
exit(0);
}
fread(inputimg, sizeof(float), mszx*mszy, fp);
fclose(fp);
img = cvCreateImage(cvSize(512,512),IPL_DEPTH_32F,1);
cvSetZero(img);
for (j = 0; j < mszy; j++) {
for (i = 0; i < mszx; i++){
img->imageData[mszx * j + i] = inputimg[mszx * j + i];
}
}
cvNamedWindow(title,CV_WINDOW_AUTOSIZE);
cvShowImage(title,img);
cvWaitKey(0);
cvDestroyWindow(title);
cvReleaseImage(&img);
return 0;
}
ここまでしかできませんでした。
No.1ベストアンサー
- 回答日時:
img->imageData[mszx * j + i] = inputimg[mszx * j + i];
に2つ間違いがあります。
・IplImage.imageDataはchar *型です。よって img->imageData[mszx * j + i] は char型です。
右辺のfloatとは型が違います。float→charへの(暗黙の)型変換が発生します。この場合、「小数点以下切り捨て」になります。
画像データだとすると,0.0~1.0だったりしないでしょうか?それだと、0と1にしかなりません。
・また、imageDataがchar*なのは、様々な深さ+チャンネルのデータに対応するためです。
ちょうど、mallocで char配列でサイズX * sizeof(型) 相当の領域を確保→「型」でサイズXの配列として使用、とするように。
また、横方向については、4バイト単位に揃える、という約束もあります。
そのため、「次の行」までのバイト数を示すwidthStepというメンバがあります。
Y座標=y,X座標=0のデータは imageData[y * widthStep + 0]から始まり、32Fなら +0,+1,+2,+3の4バイトがチャンネル1の要素、+4からが次の要素(マルチチャンネルだったら次のチャンネル)となります。
上の例では、yに対してwidthStepで「次」になっていないし、「隣の要素」へ+1しかずらしてません。
対処法としては
・cvSet~2Dを使う。
「遅い」とマニュアルにはありますが、リアルタイム処理するのでなければ十分に使える速度です。
http://opencv.jp/opencv-1.1.0/document/opencvref …
・float *へキャストする。
float *へキャストすれば、4*X+0,+1..としなくても Xでアクセスできます。
float * yline ;
for (j = 0; j < mszy; j++) {
yline = (float *)(img->imageData + j * widthStep) ;
for (i = 0; i < mszx; i++){
yline[i]=inputimg[mszx * j + i];
・直接読み込み
inputimgにfreadで直接書けるなら、 imgを確保したあとで、imageDataへ直接freadすることもできるはずです。
念のため、RAWデータのフォーマットがfloatの内部表現と一致しているかどうかは確認しておいた方がよいでしょう。
ありがとうございました!(直接読み込み)cvCreateimageで imgを確保したあとで、imageDataへ直接freadするとimgにRAWデータを読み込むことが出来ました。確認のため、読み込んだ後RAWファイル出力してimageJという画像ソフトで開くと原画と同じ画像を表示できました。ありがとうございました。
大変感謝いたします。
しかしcvNamedWindow(title,CV_WINDOW_AUTOSIZE); cvShowImage(title,img); で画像表示すると真っ白の画像になりました。この原因は何でしょうか?windowが32bit float 画像に対応していないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
干支のプログラム
-
TCP/IP通信型大文字・小文字変...
-
文字列から空白を取り除きたい...
-
Visual Studio strcpyについて
-
charでの計算?
-
c++ 文字列を入力して、一文字...
-
構造体のアライメント調整
-
DPマッチング
-
Win32APIでのエディットボック...
-
sprintf関数の作り方
-
char型+char型ってint型? if...
-
CStringをwchar_tに変換したい
-
C言語のポインターで詰まっている
-
ランダムな英文字の文字列作成
-
c言語でユーザ関数を利用して入...
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報