如何使用EDSDK捕获同一场景的“相同”RGB图像?

时间:2013-04-28 11:57:28

标签: edsdk

我们使用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;
    }

2 个答案:

答案 0 :(得分:0)

捕捉过程中会有一些随机噪音。但我认为差异太大(有时超过15%),这对于这种情况一定不正常。

我们项目的目标是校准LED屏幕的RGB像素。所以RGB的测量必须准确。

平均多次拍摄相同场景是一种选择,但这可能会导致大量时间,并且不是其他LED校准商业软件使用的最佳解决方案。

我们已经固定了相机和目标LED,并且在暗室中控制所有光线条件以保持光线不会波动。

我猜这种现象可能是由以下原因引起的:

  1. LED的像素随时间变化,快门时间是否足以保持RGB特征稳定?
  2. 我们设置光圈32,快门时间1/60,ISO 100 。你能就相机参数设置提出一些建议吗?

    1. 相机内处理。从EDSDK API文档中,我们知道在CR2-> JPEG中执行了PictureStyle和WhiteBalance操作。
    2. 我们选择默认设置。 PictureStyle =>标准,WhiteBalcne =>日光即可。它们是正确的设置吗?

      1. 第二点的另一种解决方案,正如我在最初的问题中提到的那样。我们使用原始格式(.CR2)捕获,并使用dcraw将其转换为PPM或TIFF, dcraw(-v -k 2400 -S 13000 -W -g 2.222 4.5)的参数是它们足以保持输出相同吗?

答案 1 :(得分:0)

我在5DmkII上使用EDSDK并且还比较了多个镜头。这种差异是我没有遇到过的。你能核实一下:

  • 您将相机设置为“手动”模式 - 因此无需进行魔术自动调整,例如相机中的曝光
  • 使用“连续拍摄”模式并发送按下/释放事件时得到类似的结果

但是,使用LED屏幕进行设置似乎存在问题。拍摄DLP投影仪或LED面板时,人们可能会遇到许多人工制品,因为它们具有活跃的更新性质:

  • 使用“被动”对象而不是LED屏幕获得类似(或更好)的结果
  • 关闭LED屏幕
  • 在LED屏幕上使用静态图像
  • 增加快门时间(例如1/10)以防止LED刷新率的时间混叠。减少它会产生“不完整”的刷新,但是你可以平均多次射击。