EDSDK を使用して大砲 Eos 7D を制御し、1 つの固定オブジェクトで写真を撮ります。
カメラの位置、絞り、ISO、シャッター速度、フォーカス(マニュアルフォーカス)、フラッシュランプなしなど、すべてを同じにして、すべてが変わらないように写真を撮り続けます。毎回近いRGB画像が得られることが期待されます。
しかし、キャプチャするたびに JPG 画像が異なることがわかりました。たとえば、オブジェクト ブロック全体の RGB 合計を計算します (ブロック位置は固定、背景は純粋に暗い -- ゼロ)。最初は RGB == (10000,20000,15000) を取得し、2 回目は (12000, 24000,17000)、3 回目は (9000, 18000, 13000) を取得します。写真をキャプチャする際に多少の変動やノイズが発生することはわかっています。しかし、RGB 値は毎回大幅にシフトし (-15% から 15% の差)、これはノイズではないはずです (何らかの自動調整設定が原因であると推測されます)。
なぜ異なる結果が得られるのでしょうか? どこで間違いを犯しますか?
また、raw 形式の画像 (.CR2) を取得し、dcraw.exe を使用して、同じ変換パラメーター (-v -k 2400 -S 13000 -W -g 2.222 を使用) を使用して PPM または TIFF 形式に転送します。 4.5)。ただし、画像の RGB 値は、毎回大きくシフトします。
以下は、コードのスニペットです (C# では、一部の詳細は無視されます)。
私たちの仕事は RGB 値を正確に計算することなので、この問題は私たちにとって非常に重要です。ご助力ありがとうございます !
public void main(){
EDSDK.EdsInitializeSDK();
EDSDK.EdsGetCameraList(out cameraList);
EDSDK.EdsGetChildCount(cameraList, out cameraCount);
EDSDK.EdsGetChildAtIndex(cameraList, 0, out cam);
EDSDK.EdsGetDeviceInfo(cam, out deviceInfo);
EDSDK.EdsSetPropertyEventHandler(cam, EDSDK.PropertyEvent_All, propertyEventHandle, inContext);
ObjectEventHandle = new EDSDK.EdsObjectEventHandler(ObjectEventCallBack);
EDSDK.EdsSetObjectEventHandler(cam, EDSDK.ObjectEvent_All, ObjectEventHandle, IntPtr.Zero);
EDSDK.EdsSetCameraStateEventHandler(cam, EDSDK.StateEvent_All, stateEventHandle, inContext);
EDSDK.EdsOpenSession(cam);
EDSDK.EdsSetPropertyData(cam, EDSDK.PropID_SaveTo, 0, 4, (uint)EDSDK.EdsSaveTo.Host);
EDSDK.EdsSetPropertyData(cam, EDSDK.PropID_ImageQuality, 0, 4, (uint)0x0013ff0f);
EDSDK.EdsSetPropertyData(cam, EDSDK.PropID_Av, 0, 4, (uint)0x58);
EDSDK.EdsSetPropertyData(cam, EDSDK.PropID_Tv, 0, 4, (uint)0x6b);
EDSDK.EdsSetPropertyData(cam, EDSDK.PropID_ISOSpeed, 0, 4, (uint)0x48);
EDSDK.EdsCapacity capacity = default(EDSDK.EdsCapacity);
capacity.NumberOfFreeClusters = 0x10000000;
capacity.BytesPerSector = 0x0200;
capacity.Reset = 1;
EDSDK.EdsSetCapacity(cam, capacity);
EDSDK.EdsSendCommand(cam, EDSDK.CameraCommand_TakePicture, 0);
}
public void DownloadImage(String Path, IntPtr DirItem)
{
uint Err = 0;
EDSDK.EdsDirectoryItemInfo DirInfo;
Err = EDSDK.EdsGetDirectoryItemInfo(DirItem, out DirInfo);
if (Err != 0) throw new Exception();
IntPtr Stream;
Err = EDSDK.EdsCreateFileStream(Path, EDSDK.EdsFileCreateDisposition.CreateAlways, EDSDK.EdsAccess.ReadWrite, out Stream);
if (Err != 0) throw new Exception();
Err = EDSDK.EdsDownload(DirItem, DirInfo.Size, Stream);
if (Err != 0) throw new Exception();
Err = EDSDK.EdsDownloadComplete(DirItem);
if (Err != 0) throw new Exception();
Err = EDSDK.EdsRelease(Stream);
if (Err != 0) throw new Exception();
while (!System.IO.File.Exists(Path))
Thread.Sleep(100);
}
public uint ObjectEventCallBack(uint Event, IntPtr Object, IntPtr Context)
{
switch (Event)
{
case EDSDK.ObjectEvent_DirItemCreated:
foreach (EDSFileObject File in Results)
{
if (File.mFileInfo.isFolder == 0)
{
DownloadImage(Filepath, File.mFilePointer);
}
}
}
break;
}
return EDSDKLib.EDSDK.EDS_ERR_OK;
}