C言語でBMP画像を​読み込み、matla​bで処理するDLLに​引き渡して処理をした​い時、画像の渡すには​どうすればよいのです​か?

13 visualizzazioni (ultimi 30 giorni)
悠貴 大森
悠貴 大森 il 24 Gen 2022
Risposto: Kojiro Saito il 29 Gen 2022
mxArray *in4
unsigned char *inputimage;
unsigned char BitMapFileHeader[14];//BMPのファイルヘッダーを保存する
unsigned int biSize;//BMPのサイズを保存する
int biWidth;//BMPの幅を保存する
int biHeight;//BMPの高さを保存する
unsigned char BitMapInfoHeader[28];//上記3つ以外のBMPの情報ヘッダーを保存する
int i,j,c;//for文用
FILE *fp;//ファイルポインタ
int dims[3];
fp = fopen("~//example.bmp","rb");
fread(&BitMapFileHeader, sizeof(unsigned char),14,fp);//ファイルヘッダーを読み込む
fread(&biSize, sizeof(int),1,fp);//情報ヘッダーにあるサイズを読み込む
fread(&biWidth,sizeof(int),1,fp);//情報ヘッダーにある幅を保存
fread(&biHeight,sizeof(int),1,fp);//情報ヘッダーにある高さを保存
fread(&BitMapInfoHeader,sizeof(unsigned char),28,fp);//残りの情報ヘッダーを保存
dims[0] = biHeight;
dims[1] = biWidth;
dims[2] = 3;
inputimage = (unsigned char*)mxMalloc(sizeof(const char*)*biHeight*biWidth*3);
for(i = 0; i<biHeight;i++){//0から幅まで
for(j = 0;j<biWidth; j++){//0から高さまで
for(c=0;c<3;c++){//RGBのそれぞれ
fread((inputimage+i*biWidth*3+j*3+c),sizeof(unsigned char),1,fp);//画素の情報を読み込んで保存する
}
}
}
fclose(fp);
in4 = mxCreateNumericArray(3, (const mwSize*)dims, mxUINT8_CLASS,0);
memcpy(mxGetChars(in4), inputimage, sizeof(unsigned char)*biWidth*biHeight*3);//Run time error Access violation
mlfDllexample(1, &out, in4);//in4で画像を渡し、outで画像を返す。
  2 Commenti
Kojiro Saito
Kojiro Saito il 24 Gen 2022
質問内容についてクリアにさせてください。上記のコードで迷われているのはCでのoutの定義のしかたについてでしょうか?
悠貴 大森
悠貴 大森 il 26 Gen 2022
いえ、まよっているのはin4への画像値データの受け渡しです。

Accedi per commentare.

Risposta accettata

Kojiro Saito
Kojiro Saito il 29 Gen 2022
ドキュメント(https://jp.mathworks.com/help/releases/R2020b/compiler_sdk/cxx/calling-a-shared-library.html)の「Call a C Shared Library from Your C Driver Application」のサンプルのように、MATLAB Runtimeの初期化 (mclInitializeApplication)やライブラリの初期化 (<ライブラリ名>Initialize、ドキュメントではlibmatrixInitialize)を実行してからmxCreateNumericArrayを実行されているかのご確認をお願いします。
また、mxCreateNumericArrayのところでこのままでは「Unhandled C++ exception」が発生します。
int dims[3];
int *dims[3];
に変更してから
in4 = mxCreateNumericArray(3, (const mwSize*)dims, mxUINT8_CLASS,0);
を実行するようにしてください。
もう一つ、
fread((inputimage+i*biWidth*3+j*3+c),sizeof(unsigned char),1,fp);//画素の情報を読み込んで保存する
のところでこのままではMATLABのライブラリに、画像の向きとRGBの色が違う画像データが渡されてしまいます。
MATLABの画像の座標系はこちらのドキュメントに詳細がありますが、行の最初が画像の左上の地点になります。Cでは画像の左下が行の最初になるので、上記のfor文のiのところを(biHeight-i)にする必要があります。
またBMP画像はRGBではなくBGRの順で色情報が含まれているので、上記のfor文のcのところを(2-c)にする必要があります。
変更後はこのようになります。
fread((inputimage + (biHeight - i) + biHeight * j + biHeight * biWidth * (2 - c)), sizeof(unsigned char), 1, fp);
参考になれば幸いです。

Più risposte (0)

Categorie

Scopri di più su MATLAB Compiler SDK in Help Center e File Exchange

Tag

Prodotti


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!