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

10 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)

Categories

Find more on MATLAB 入門 in Help Center and File Exchange

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!