我们使用EDSDK控制大炮Eos 7D,用一个固定物体拍照。
我们尝试使一切都相同,包括相机位置,光圈,ISO,快门速度,对焦(手动对焦),无闪光灯,并逐个拍照以确保一切都不会改变。我们期望每次都能获得接近的RGB图像。
但后来我们发现每次拍摄时JPG图像都不同。例如,我们计算整个对象块的RGB总和(块位置是固定的,背景是纯黑色 - 零),第一次得到RGB ==(10000,20000,15000),第二次得到(12000, 24000,17000),我们第三次得到(9000,18000,13000)。我们知道拍摄照片时必须有一些小的变化/噪音。但RGB值每次都移动很多(差异为-15%到15%),这一定不是噪声(我们猜测它必须是由一些自动调整设置引起的)。
为什么我们得到不同的结果?我们在哪里弄错了?
我们还尝试获取原始格式图像(.CR2),然后使用dcraw.exe将其转换为PPM或TIFF格式,使用相同的转换参数(我们使用-v -k 2400 -S 13000 -W -g 2.222 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;
}
答案 0 :(得分:0)
捕捉过程中会有一些随机噪音。但我认为差异太大(有时超过15%),这对于这种情况一定不正常。
我们项目的目标是校准LED屏幕的RGB像素。所以RGB的测量必须准确。
平均多次拍摄相同场景是一种选择,但这可能会导致大量时间,并且不是其他LED校准商业软件使用的最佳解决方案。
我们已经固定了相机和目标LED,并且在暗室中控制所有光线条件以保持光线不会波动。
我猜这种现象可能是由以下原因引起的:
我们设置光圈32,快门时间1/60,ISO 100 。你能就相机参数设置提出一些建议吗?
我们选择默认设置。 PictureStyle =>标准,WhiteBalcne =>日光即可。它们是正确的设置吗?
答案 1 :(得分:0)
我在5DmkII上使用EDSDK并且还比较了多个镜头。这种差异是我没有遇到过的。你能核实一下:
但是,使用LED屏幕进行设置似乎存在问题。拍摄DLP投影仪或LED面板时,人们可能会遇到许多人工制品,因为它们具有活跃的更新性质: