.Net 玩單反


就如標題所示了 源碼地址 https://github.com/dubing/CannonSDKandWia/


背景

一年多沒逛園子了,換了個行業圈子,感覺自己太花心了點,不過能接觸到不同的研發文化也算有點收獲,游戲圈子的技術流、電商圈子的業務流、媒體圈子的藝術流等等。

這個應用產生的背景是讓單反相機自動化,本身老大的意思是想做針對usb接口的編程,不過太底層的技術用c#來做不是很合適。討價還價了一番,那就針對單反來做吧。

假設一個場景,我們需要N台單反設備瞄准一朵花,每隔30秒拍一張照片並且自動發到微博上。


技術點

  佳能SDK  

  WIA標准

  佳能sdk提供了dll給.net開發者引用,通過對sdk的調用可以方便的佳能對應型號的相機,不過對於獲取相機內的數據.net版本 sdk中並沒有提供。那么如何獲取單反相機內的數據就成了一個問題點。有些同學可能會疑惑,單反相機接入電腦usb插口不就會產生一個盤符么,直接用DriveInfo.GetDrives()獲取盤符遍歷不就可以了么。這里先給大家掃盲一下,USB從設備的分類可以從USB設備接口描述符對應的的bInterfaceClass這一個byte得到。 bInterfaceClass的典型代碼為1,2,3,6,7,8,9,10,11,255。分別代表意思為1-audio:表示一個音頻設 備。2-communication device:通訊設備,如電話,moden等等。3-HID:人機交互設備,如鍵盤,鼠標等。6-image圖象設備,如掃描儀,攝像頭等,有時數碼相 機也可歸到這一類。7-打印機類。如單向,雙向打印機等。8-mass storage海量存儲類。所有帶有一定存儲功能的都可以歸到這一類。如數碼相機大多數都歸這一類。9-hub類。11-chip card/smart card。255-vendor specific.廠家的自定義類,主要用於一些特殊的設備。如接口轉接卡等。

  我們的driveinfo可以捕捉的設備類型為

public enum DriveType
    {
        // Summary:
        //     The type of drive is unknown.
        Unknown = 0,
        //
        // Summary:
        //     The drive does not have a root directory.
        NoRootDirectory = 1,
        //
        // Summary:
        //     The drive is a removable storage device, such as a floppy disk drive or a
        //     USB flash drive.
        Removable = 2,
        //
        // Summary:
        //     The drive is a fixed disk.
        Fixed = 3,
        //
        // Summary:
        //     The drive is a network drive.
        Network = 4,
        //
        // Summary:
        //     The drive is an optical disc device, such as a CD or DVD-ROM.
        CDRom = 5,
        //
        // Summary:
        //     The drive is a RAM disk.
        Ram = 6,
    }

   一般u盤設備都是Removable的,但是單反相機是PortableDevice,用GetDrives方法是獲取不到這種類型的。在windows systems32中提供了一系列針對portabledevice的api方法有興趣的同學可以嘗試下

  這里我選擇的是wia接口編程,WIA 是 Windows Image Acquisition 的簡稱,當前可用版本是 WIA 1.0,它是 Windows Millennium Edition (Windows Me) 或者更高版本的 Windows 系統中提供的數字圖像獲取服務,同時它也能用於管理數字圖像設備。WIA 是使用進程外(Out of process)服務實現的 COM 組件,和大多數進程外服務程序不同的是,WIA 通過提供自己的數據傳送機制(IWiaDataTransfer 接口),避免了圖像數據傳送過程中的性能損失。高性能的 IWiaDataTransfer 接口使用共享內存來傳送數據給客戶程序。
WIA 有三個主要的組件:Device Manager,Minidriver Service Library 和 Device Minidriver。
◆Device Manager: 枚舉圖像設備,獲取設備屬,為設備建立事件和創建設備對象;
◆Minidriver Service Library: 執行所有設備無關的服務;
◆Device Minidriver 解釋映射: WIA 屬性和命令到特定的設備。
通過DeviceManagerClass().DeviceInfos中的信息 我們可以采集到單反中有屬於CameraDeviceType的設備信息,至於視頻等其他類型有其他類似方法。

        public void DownJpgFromAllCamera()
        {
            int i = 1;
            foreach (IDeviceInfo DevInfo in new DeviceManagerClass().DeviceInfos)
            {
                if (DevInfo.Type == WiaDeviceType.CameraDeviceType)
                {
                    string DeviceID = DevInfo.DeviceID;
                    Device wDevice = DevInfo.Connect();
                    Devparam dev = new Devparam {wiaDevice=wDevice, DeviceID = DeviceID, index = i };
                    new Thread((Camera) => 
                        {
                            DownJpg(((Devparam)Camera).wiaDevice, ((Devparam)Camera).DeviceID, ((Devparam)Camera).index);
                        }
                        ).Start(dev);
                 
                  
                    i++;
                }
            }
        }

   再來談談SDK,佳能sdk .net版本中提供5種句柄委托

        public delegate uint EdsProgressCallback( uint inPercent, IntPtr inContext, ref bool outCancel);
        public delegate uint EdsCameraAddedHandler(IntPtr inContext);
        public delegate uint EdsPropertyEventHandler(uint inEvent, uint inPropertyId, uint inParam, IntPtr inContext); 
        public delegate uint EdsObjectEventHandler( uint inEvent, IntPtr inRef, IntPtr inContext); 
        public delegate uint EdsStateEventHandler( uint inEvent, uint inParameter, IntPtr inContext);

第一個用於數據處理過程例如數據復制、圖片保存等。

第二個用於pc發現新的相機設備

第三個用於相機內數據流等屬性狀態變化通知,例如拍照動作產生的系列變化

第四個用於文件操作 例如文件創建 刪除等等

第五個用於相機自身的狀態時間 例如開關機 異常等

各種應用的場景大家參看下demo程序 雖然load方法開啟的是多線程 但是硬盤io本身是串行的 這里只是寫着玩 大家不用認真


效果圖

  新添加相機設備

程序控制相機拍照

本地加載相機內照片數據

 


題外話

程序只是demo,調查兼娛樂。有bug是肯定的,sdk的dll請大家下載最新的參考api文檔。源碼程序參考頁首


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM