0

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

2 回答 2

0

捕获过程中存在一定的随机噪声。但我认为方差太高(有时超过 15%),这对于这种情况来说一定是不正常的。

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

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

我们已经修复了相机和目标 LED 屏幕,所有的光线条件都控制在暗室中,以保持光线不波动。

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

  1. LED的像素随时间变化,那么快门时间是否足够长以保持RGB测量稳定?

我们设置光圈 32,快门时间 1/60,ISO 100。您能对相机参数设置提出一些建议吗?

  1. 相机内处理。从 EDSDK API 文档中,我们知道在 CR2->JPEG 中有 PictureStyle 和 WhiteBalance 操作。

我们选择默认设置。图片样式 => 标准,WhiteBalcne => 日光。他们是正确的设置吗?

  1. 正如我在最初的问题中提到的,第二点的另一个解决方案。我们以原始格式 (.CR2) 捕获,并使用 dcraw 将其转换为 PPM 或 TIFF,dcraw (-v -k 2400 -S 13000 -W -g 2.222 4.5)的参数是否足以保持输出相同的?
于 2013-04-28T23:50:08.147 回答
0

我在 5DmkII 上使用 EDSDK 并比较多个镜头。这种差异是我没有遇到的。您能否验证:

  • 你的相机处于“手动”模式——所以没有神奇的自动调整,比如相机中的曝光
  • 使用“连拍”模式并发送按下/释放事件时获得相似的结果

但是,您的 LED 屏幕设置似乎有问题。拍摄 DLP 投影仪或 LED 面板时可能会遇到许多人工制品,因为它们具有主动更新特性:

  • 使用“被动”对象而不是 LED 屏幕获得类似(或更好)的结果
  • 关掉你的 LED 屏幕
  • 在 LED 屏幕上使用静态图像
  • 增加快门时间(例如 1/10)以防止 LED 刷新率出现时间混叠。减少它会给出“不完整”的刷新,但是你可以平均多次拍摄。
于 2013-05-17T12:22:07.087 回答