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

12 ビュー (過去 30 日間)
悠貴 大森
悠貴 大森 2022 年 1 月 24 日
回答済み: Kojiro Saito 2022 年 1 月 29 日
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 件のコメント
Kojiro Saito
Kojiro Saito 2022 年 1 月 24 日
質問内容についてクリアにさせてください。上記のコードで迷われているのはCでのoutの定義のしかたについてでしょうか?
悠貴 大森
悠貴 大森 2022 年 1 月 26 日
いえ、まよっているのはin4への画像値データの受け渡しです。

サインインしてコメントする。

採用された回答

Kojiro Saito
Kojiro Saito 2022 年 1 月 29 日
ドキュメント(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);
参考になれば幸いです。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMATLAB Compiler SDK についてさらに検索

タグ

製品


リリース

R2020b

Community Treasure Hunt

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

Start Hunting!