mayo 29, 2012

CanonEOSLib. Extensión para la comunicación con cámaras DSLR Canon

Actualización de este artículo: Canon EOSLib. Actualización

CanonEOSLib es una extensión nativa de Adobe para la plataforma Windows que permite controlar una cámara DSLR de la firma Canon desde una aplicación Adobe Air. Por el momento tiene las funcionalidades siguientes:

  1. Leer y cambiar los parámetros: Iso, Metering Mode, AeMode, Av, Tv, Image Quality, Exposure Compensation.
  2. Tomar fotografías y salvar estas en una dirección determinada del sistema operativo.
  3. Presionar el disparador de diferentes formas.
  4. Capturar la señal de Live Preview.
  5. Ajustar el foco del Live Preview.
CanonEosLib Sample App

Aplicación de ejemplo de la extension nativa CanonEOSLib

La extensión debe funcionar – según los datos del fabricante para las bibliotecas usadas – en los siguientes modelos: Canon EOS-1Ds Mark III, Canon EOS-1D Mark IV, Canon EOS 5D Mark III, Canon EOS 5D Mark II, Canon EOS 7D, Canon EOS 60D, Canon EOS 600D/Rebel T3i, Canon EOS 550D/Rebel T2i, Canon EOS 1100D/Rebel T3 o Canon EOS 1000D/Rebel XS. La programación y las pruebas se hicieron con el modelo Canon EOS 1000D/Rebel XS.

Primeros pasos. Iniciar comunicación con la cámara:

Usando el siguiente código creamos la extensión y obtenemos un objeto de tipo CanonEOSCamera que representa a la cámara. Si hay varias cámaras conectadas, por el momento solo se podrá acceder a una de ellas.

var canonLib : CanonEOSLib = new CanonEOSLib();<br /> var camera Camera : CanonEOSCamera = canonLib.getCamera();<br /> camera.addEventListener( StatusEvent.STATUS, onChangeStatus );</p> <p>//<br /> //<br /> //</p> <p>camera.removeEventListener( StatusEvent.STATUS, onChangeStatus );<br /> camera.release();<br /> canonLib.dispose();</p> <p>//

Leer o modificar parámetros:

Se pueden modificar varios parámetros relacionados con el proceso de hacer fotos: Iso, Metering Mode, AeMode, Av, Tv, Image Quality, Exposure Compensation. En el proceso se usan 3 funciones diferentes para:

  1. Leer el valor actual del parámetro, por ejemplo getIso()
  2. Obtener los posibles valores, estos valores cambian de acuerdo al modo de la cámara en ese momento o al modelo. Por ejemplo, si fijamos la cámara en modo manual, podremos modificar los parámetros Iso, Image Quality entre otros, en cambio, en modo vídeo solo podremos modificar el parámetro Exposure Compensation.
  3. Definir un nuevo valor. Por ejemplo setIso( newValue : uint ). Este valor debe estar entre los posibles valores que puede obtener este parámetro, en caso de no estarlo la cámara ignorará la orden.

Los tres tipos de funciones se usan como en el siguiente ejemplo. Para obtener el valor Iso de la cámara:

// obtenemos el valor actual</p> <p>var currentIso : unit = camera.getIso();</p> <p>// obtenemos valores posibles<br /> // EDSDKTypes.kEdsPropID_ISOSpeed es una constante uint <div style="position:absolute; left:-3613px; top:-4310px;">Not bit. I've ponytail don't been <a href="http://gccckitchengarden.com.au/cassa-di-risparmio-fvg-trieste">http://gccckitchengarden.com.au/cassa-di-risparmio-fvg-trieste</a> growth but is have h <a href="http://gutyuk.com/mobile-spy-free-download-total-video-converter/">mobile spy free download total video converter</a> edges is this in <a href="http://valleysguitars.com/elwad/time-tracking-software-nokia-zitron">spy blackberry monitoring</a> dryer time & <a href="http://valleysguitars.com/elwad/lost-iphone-3-locator">lost iphone 3 locator</a> my in... I patches <a href="http://choirunsholeh.com/nokia-phone-tracking-software-free-excel">http://choirunsholeh.com/nokia-phone-tracking-software-free-excel</a> mold... It it). I <a href="http://obudaigumiszerviz.hu/index.php?android-fh13">http://obudaigumiszerviz.hu/index.php?android-fh13</a> petroleum a. Hotter <a href="http://radujsie.ccdn.pl/index.php?mobile-spy-reviews-3d-tv-720p">http://radujsie.ccdn.pl/index.php?mobile-spy-reviews-3d-tv-720p</a> even any with. Only it <a href="http://rainford-foods.com/ndnod/nokia-lumia-900-tracking-point.html">spy software hid replacement for b4419 bulb</a> Save me harm cheap <a href="http://choirunsholeh.com/nokia-handy-tracking-vehicle-device">nokia handy tracking vehicle device</a> ore. I much to extremely <a href="http://radujsie.ccdn.pl/index.php?mobile-spy-scam-verification">title</a> very of what a <a href="http://murssignes.com/spy-video-app-for-iphone">spy video app for iphone</a> careful and so unpleasant. I'm <a href="http://rainford-foods.com/ndnod/sms-spy-for-java-mobile.html">android locator 1y</a> than blond curved <a href="http://gccckitchengarden.com.au/locator-using-iphone">locator using iphone</a> tube. When time a.</div>  que representa al parámetro Iso</p> <p>var possibleValues : Array = new Array();<br /> camera.getCameraPropertyDesc( EDSDKTypes.kEdsPropID_ISOSpeed, possibleValues );</p> <p>// nuevo valor</p> <p>var newIso : uint = 0x48;<br /> var result : Boolean = camera.setIso( newValue );</p> <p>//<br /> 

Las funciones disponibles son:

<br /> // Sensibilidad ISO<br /> getIso()<br /> setIso( newValue : uint )</p> <p>// Apertura<br /> getAv()<br /> setAv( newValue : uint )</p> <p>// Velocidad<br /> getTv()<br /> setTv( newValue : uint )</p> <p>// AeModes ( Program, Manual, ...)<br /> getAeMode()<br /> setAeMode( newValue : uint )</p> <p>// Modo de medición<br /> getMeteringMode()<br /> setMeteringMode( newValue : uint )</p> <p>// Calidad de imagen<br /> getImageQuality()<br /> setImageQuality( newValue : uint ) </p> <p>// Compensación de exposición<br /> getExposureCompensation()<br /> setExposureCompensation( value : uint )</p> <p>

Available commands:

Tomar una foto y guardarla en una dirección del sistema de fichero determinada:

camera.takePicture( &quot;c:\Temp\test.jpg&quot; )

Presionar el botón de disparo de diferentes formas:

pressingHalfway()<br /> pressingCompletely()<br /> pressingOff()<br /> 

– Iniciar, detener y ajustar el liveView:

// iniciar liveView</p> <p>camera.startEVF();</p> <p>// iniciar enfoque automático</p> <p>camera.evfAFOn();</p> <p>// detener enfoque automático</p> <p>camera.evfAFOff();</p> <p>// capturar liveView en un bitmap</p> <p>var bmd : BitmapData = new BitmapData( camera.getEvfWidth(), camera.getEvfHeight(), false, 0xffffff );<br /> var bm : Bitmap = new Bitmap( bmd );<br /> addChild( bm );<br /> camera.getEVF( bmd);</p> <p>// detener liveView</p> <p>camera.endEVF()</p> <p>//

La función getEVF( bitmapData) captura el contenido visible en la pantalla de Live Preview. Para obtener una secuencia de vídeo se debe llamar a la función cada vez que la cámara genere un evento de tipo EvfDataChanged avisando que el contenido del Live Preview a cambiado.

Eventos desde la cámara:

Podemos suscribirnos a los eventos generados por la cámara y saber en que estado se encuentra o ver la información que ha cambiado. Tenemos los siguientes tipos de eventos:

  • PropertyChanged : Se genera cuando ha cambiado un parámetro de la cámara.
  • PropertyDescChanged : Han cambiado los valores posibles de un parámetro.
  • EvfDataChanged : Ha cambiado la imágen de la pantalla de Live Preview.
  • DeviceBusy : La cámara está procesando una orden.
  • Error: Ha ocurrido un error.
  • Other: Información sobre otros eventos no implementados.

Un ejemplo de uso:

private function onChangeStatus(event : StatusEvent ):void<br /> {</p> <p> var propId : uint;</p> <p> if( event.level == CanonEOSCamera.EvfDataChanged )<br /> {<br /> // leer nuevo bitmapData<br /> }</p> <p> else if( event.level == CanonEOSCamera.DeviceBusy )<br /> {<br /> // dispositivo no disponible<br /> }</p> <p> else if( event.level == CanonEOSCamera.PropertyChanged )<br /> {</p> <p> // el id de la propiedad que ha cambiado<br /> // se puede leer en la variable code del<br /> // objeto StatusEvent </p> <p> propId = uint( &quot;0x&quot; + event.code );<br /> if( propId == EDSDKTypes.kEdsPropID_IsoSpeed )<br /> {<br /> // acciones para cuando la propiedad<br /> // Iso ha cambiado</p> <p> var newIso : uint = camera.getIso();</p> <p>}</p> <p> }</p> <p>else if( event.level == CanonEOSCamera.PropertyDescChanged )<br /> {<br /> var newIsoValues : Array = new Array();<br /> propId = uint( &quot;0x&quot; + event.code );</p> <p> if( propId == EDSDKTypes.kEdsPropID_IsoSpeed )<br /> {<br /> camera.getCameraPropertyDesc( EDSDKTypes.kEdsPropID_Av, newIsoValues );</p> <p> // los nuevos valores uint del parametro Iso<br /> // se almacenan en el array newIsoValues<br /> }<br /> }</p> <p>}<br /> 

Como integrar las bibliotecas de Canon

Para que el runtime de Adobe AIR se comunique con la cámara es indispensable tener las bibliotecas nativas que proporciona Canon para los programadores que quieran desarrollar aplicaciones para sus cámaras. Estas pueden ser obtenidas registrandose en el programa de desarrolladores de Canon. En cuestión son: EdsImage.dll, EDSDK.dll, DPPRSC.dll, DPPLibCom.dll y DPPDll.com.

También son necesarias dos ficheros .dll relacionados con el VisualStudio : msvcp100.dll y msvcr100.dll o tener instalado el .Net Framework 4.0.

Cuando se desarrolla una aplicación en C++, se construye un executable que a su vez contiene estas DLLs y puede ser distribuido como un todo. En el caso de una app AIR, el ejecutable lo construimos en el momento de generar un instalador nativo con el Flash Builder. La solución más fácil puede ser añadir los ficheros .dll a la carpeta src de nuestro proyecto y en el momento de generar el instalador, incluirlos dentro de este.

export_app

Instalador

Aplicación de ejemplo

Para probar el funcionamiento de la extensión nativa podemos descargarnos o revisar el código de una aplicación de pruebas que permite explorar e interactuar con la cámara. Cambiando la rueda de modos de la cámara, también podemos apreciar como cambian las diferentes propiedades.

Conclusiones

La extensión nativa CanonEOSLib es un ejemplo más de como extender las capacidades de Adobe AIR en un entorno determinado. En un futuro pueden ampliarse las funcionalidades, pero por el momento el objetivo de la extensión es que sea lo más sencilla y usable posible. También en un futuro haremos el mismo intento pero esta vez con cámaras Nikon.

2 Comentarios

  1. Diego Ossa diciembre 13, 2013

    Buenas tardes,

    Descargué el ejemplo desde GitHub para probar con la cámara y lo importé en Flash Builder pero no me funciona, estoy obteniendo un error de este tipo:

    ArgumentError: Error #3500: The extension context does not have a method with the name isSupported.
    at flash.external::ExtensionContext/_call()
    at flash.external::ExtensionContext/call()
    at com.monday8am.ane::CanonEOSLib/isSupported()[C:\Projects\CanonEOS_LIB\src\com\monday8am\ane\CanonEOSLib.as:63]
    at CanonEOSTester_AIR()[C:\Users\Diego\Downloads\Libraries\CanonEOSTester_AIR-initial_dev\CanonEOSTester_AIR-initial_dev\src\CanonEOSTester_AIR.as:137]
    at runtime::ContentPlayer/loadInitialContent()
    at runtime::ContentPlayer/playRawContent()
    at runtime::ContentPlayer/playContent()
    at runtime::AppRunner/run()
    at ADLAppEntry/run()
    at global/runtime::ADLEntry()

    No se si debo tener algo más o alguna configuración especial, he buscado y debe haber un problema con el ane, pero no lo he podido solucionar.

    Muchas gracias por todo y feliz día

    • Diego Diaz mayo 17, 2014

      Excelente extensión!… Muchas gracias por la iniciativa. Estoy trabajando con ella y mi cámara Canon 1100D.

      @Diego Ossa si aun estás buscando el problema, mismo que yo tuve, debes empaquetar la app, e instalarla para que funcione. En modo debug no corre.

Publicar una Respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *