Cの関数からBitm​ap画像ポインタを受​け取り、MATLAB​でBitmap画像を​表示したい。

8 views (last 30 days)
まったくの初心者で恐縮ですが、
あるC言語ベースの画像取得APIを使用しており、MATLABでの使用方法についてアドバイスいただけないでしょうか。
Cでの記載は以下になります(型情報を省略しております)
①long size = ImageBufferSize(); //ここはできました
②ImageBuffer = malloc(size); //MATLABでのメモリ確保がいまひとつ理解できません(できない?)
③GetImage(&ImageBuffer); //確保したバッファの先頭アドレスを渡したい。C関数内でBitmap画像が書き込まれる。
④ImageBufferをimreadで画像を読み込んだのと同じように扱いたい。
情報不足でしたら申し訳ありません。
よろしくお願いします。

Accepted Answer

交感神経優位なあかべぇ
Edited: 交感神経優位なあかべぇ on 17 Sep 2023
MATLABとC言語を連携させるには、下記等の方法があります。
① MATLABからC言語を呼び出す。
loadlibraryを使用して、共有ライブラリ(.DLLや.soなど)を呼び出す。
 ・ MATLABで使用できる形式にC言語をmexを使用してビルドする。(Windows 64bitの場合は、.mexw64を生成させる)Visual Studioで開発したい場合は、こちらの方が公開しているVisual Studioのテンプレートを使用すれば、簡単に開発環境を設定でき、Visual Studioのビルドで、.mexw64ファイルまで生成できました。
② C言語からMATLABを呼び出す。
 ・ C言語内で、MATLAB Engineを呼び出して、MATLAB関数等を使用する。
個人的には、loadlibraryを使用した共有ライブラリの呼び出しが、一番直感的に使用できるかなと思います。
Windowsでのloadlibraryの使用例を書いてみました。下記の例ではまず、PictureGetDll.h、PictureGetDll.c等をDLLファイルとしてビルドします。
PictureGetDll.h
#pragma once
#ifdef DLLEXPORT
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif
#include <stdint.h>
DECLSPEC int32_t WrapperImageBufferSize();
DECLSPEC void WrapperGetImage(uint8_t* imageData_out);
PictureGetDll.c
#define DLLEXPORT
#include "PictureGetDll.h"
#include "OriginalCode.h" // ImageBufferSizeGetImageが定義されている.hファイル
int32_t WrapperImageBufferSize()
{
return ImageBufferSize(); // とりあえず24 * 24 * 3を出力させた
}
void WrapperGetImage(uint8_t* imageData_out)
{
GetImage(imageData_out); // とりあえず縦横 24*24*3MATLABアイコンの画像データを出力させた
}
生成したPictureGetDll.dllとPictureGetDll.hをMATLABパスの通った同じフォルダにいれると下記の方法でloadlibraryで.dllを読み込むことができます。
下記DLLの呼び出し例
  1 Comment
atsushi komuro
atsushi komuro on 21 Sep 2023
Edited: atsushi komuro on 21 Sep 2023
ありがとうございます。まさにやりたいことはこれでした。
念のため、ひとつ質問させてください。
WrapperGetImageで渡す画像データの先頭アドレスはBitmapInfoheaderを省いたものを渡すべきでしょうか?
まずはやってみようと思います。

Sign in to comment.

More Answers (0)

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!