2

MATLAB を介して接続しようとしている USB カメラ ( DCC1645 ) があります。ActiveX 経由で正常に接続できました。

cam = actxcontrol('uc480.uc480Ctrl.1');

その上でさまざまな機能を実行できます。画像データを取得する方法を考えています。関連する関数は、メモリ内の画像へのポインターを返します。

GetImageMem() returns the pointer to the internal image memory where the image is stored.

だから私が走ると

loc = cam.GetImageMem();

次にloc、メモリの場所を表す大きな数字です。格納されているメモリ量を取得する関数は次のとおりです。

InquireImageMem(LONG* nWidth, LONG* nHeight, LONG*nBits, LONG* nPitch) 
reads the properties of the allocated image memory. The function returns 
the properties of the actual image buffer, as returned by GetImageMem

nWidth     Receives the width of the allocated image memory.
nHeight    Receives the height of the allocated image memory.
nBits      Receives the bits per pixel of the allocated image memory.
nPitch     Receives the pitch of the allocated image memory. The pitch 
           is the number of bytes from the start of a line to the start 
           of the next line.

だから私の質問は2つあります:

  1. メモリへのポインタとサイズを指定して、実際のデータを取得するにはどうすればよいですか?
  2. 関数への参照をどのように渡しますか (LONG* nwidth など)? 私が使用すべきlibpointerのようなものはありますか?

ありがとう!

4

3 に答える 3

1

uEye .NET ユーザー レイヤーを使用してみてください http://en.ids-imaging.com/manuals/uEye_SDK/EN/uEye_DotNET_Manual/index.html?ueyeinstallation.htm

以下は、MATLAB コードの例です。


clear all

close all

computer_type=computer;

if strcmp (computer_type,'PCWIN64')

NET.addAssembly('C:\Program Files\IDS\uEye\Develop\DotNet\x64\uEyeDotNetUserLayer.dll');

NET.addAssembly('C:\Program Files\IDS\uEye\Develop\DotNet\x64\uEyeDotNetApiLayer.dll');

elseif strcmp (computer_type,'PCWIN')

NET.addAssembly('C:\Program Files\IDS\uEye\Develop\DotNet\x86\uEyeDotNetUserLayer.dll');

NET.addAssembly('C:\Program Files\IDS\uEye\Develop\DotNet\x86\uEyeDotNetApiLayer.dll');

end

cam = uEye.Camera;

cam.Exit();

CAM_ID=2;

exposure_ms=2;

cam.Init(CAM_ID);

ColorMode=uEye.Defines.ColorMode.SENSOR_RAW8;

cam.PixelFormat.Set(11);

cam.Trigger.Set(uEye.Defines.TriggerMode.Software);

[tmp, memId] = cam.Memory.Allocate(true);

[tmp, imgWidth] = cam.Memory.GetWidth(memId);

[tmp, imgHeight] = cam.Memory.GetHeight(memId);

[tmp, imgBpp] = cam.Memory.GetBitsPerPixel(memId);

imgBpp = imgBpp / 8;

imgSize = imgWidth * imgHeight * imgBpp;

bufArr = NET.createArray('System.Byte', imgSize);

soft = uEye.Software(CAM_ID);

soft.SetEnableAutoWhiteBalance(false);

soft.SetEnableAutoGain(false);

soft.SetEnableAutoShutter(false);

cam.Timing.Exposure.Set(exposure_ms); % msec

cam.Acquisition.Freeze(1);

[tmp, camMemPtr] =  cam.Memory.ToIntPtr;

System.Runtime.InteropServices.Marshal.Copy(camMemPtr, bufArr, 0, imgSize);

img = uint8(bufArr);

myImage=reshape(img, imgWidth, imgHeight)';
于 2013-04-21T05:50:56.417 に答える
1

1) 短い答えは「いいえ」です。行列の場所と大きさがわかっている場合でも、MATLAB のメモリから行列を引き出すことはできません。ただし、この特定のカメラはImage Acquisition ツールボックスでサポートされており、関連するチュートリアルはこちら にあります

詳細はわかりませんが、MATLAB コードに mex/c を追加すれば、それを機能させることができます。

2)元の質問へのコメントに書いたように、

[a,b,c,d] = cam.InquireImageMem(0,0,0,0);

動作します。cam.methods('-full')ライブラリ内のすべての可能なメソッドのリストと、それらに必要な入力/出力を取得するために使用します。

于 2012-08-16T21:51:38.470 に答える