[Jderobot] [Jderobot-dev] Duda sobre CameraServer y el modo de servir imágenes

Alberto Martin almartinflorido en gmail.com
Dom Jul 21 18:04:28 CEST 2013


Buenas a todos,

estoy desarrollando ArDroneServer que es un wrapper del SDK oficial de
ArDrone para controlar el aparato desde jderobot. El cuadricoptero dispone
de dos cámaras; una frontal (que apunta al frente) y otra vertical (que
apunta al suelo). Para poder obtener las imágenes desde el drone he
incluido en ArDroneServer el código del componente CameraServer, de este
modo puedo obtener las imágenes fácilmente a través de Ice.

En la versión 1.0 de ArDrone las imágenes de ambas cámaras se sirven en un
único flujo, me explico, el SDK dispone de cuatro modos; uno para la cámara
frontal, otro para la vertical, otro  para mostrar la vertical en la
esquina superior izquierda sobre la imagen de la cámara frontal y el ultimo
que es el inverso al anterior modo. Esto implica que no puedo obtener
simultáneamente  las imágenes de las cámaras por separado. Cada vez que se
refresca la imagen, el SDK lo almacena en un buffer que tiene un tamaño
definido en [1], de esta manera, independientemente del modo que se esté
visualizando la imagen resultante se almacena en ese buffer.

Cada modo tiene un tamaño y para ArDroneServer nos interesan el modo para
la cámara frontal y vertical que tienen los siguientes tamaños [2]. Para
poder servir las imágenes tuve que modificar el modo de adquisición de las
imágenes en CameraServer quedando del siguiente modo [3], con estas
modificaciones podéis ver el resultado en [4] para la cámara frontal y en
[5] para la cámara vertical. Como se puede ver en [5] se puede apreciar la
imagen servida por la cámara vertical y debajo de ella los "restos" de la
imagen frontal en estático (no cambian ya que es el residuo de la anterior
imagen).

Para ArDroneServer nos gustaría poder recibir las imágenes por separado por
lo que hice la siguiente modificación en CameraServer [6], con esto quiero
conseguir que en función del modo actual seleccionado para la cámara
CameraServer sirva una imagen o la otra. Para la imagen frontal todo
funciona como antes, se pude ver el resultado en [7]. Sin embargo para la
cámara vertical sucede algo que no entiendo, podéis ver el resultado en [8].

¿Alguien sabe a qué se debe este resultado?

Un saludo a todos.

[1] video.h:
#define MAX_STREAM_WIDTH 640
#define MAX_STREAM_HEIGHT 360
[2] video.h:
// Drone 1 Static Stream Size & PIP Stuff
// PIP is not supported in AR-Drone SDK 2.0
#define D1_STREAM_WIDTH 320
#define D1_STREAM_HEIGHT 240
//Vertical Camera standalone
#define D1_VERTSTREAM_WIDTH 174
#define D1_VERTSTREAM_HEIGHT 144
[3] cameraserver.cpp:
vp_os_mutex_lock(&video_lock);
frame=cv::Mat(D1_STREAM_HEIGHT,D1_STREAM_WIDTH,CV_8UC3,(void*)buffer);
vp_os_mutex_unlock(&video_lock);
También tuve que suprimir la linea donde se establecia en color
cv::cvtColor(frame, frame, CV_RGB2BGR);
[4] normal_horizontal:
http://jderobot.org/store/amartinflorido/uploads/images/0_normal_hor.png
[5] normal_vertical:
http://jderobot.org/store/amartinflorido/uploads/images/1_normal_vert.png
[6] cameraserver.cpp:
vp_os_mutex_lock(&video_lock);
//cámara frontal
if(cam_state==0){
frame=cv::Mat(D1_STREAM_WIDTH,D1_STREAM_HEIGHT,CV_8UC3,(void*)buffer);
mycamera->imageDescription->width=D1_STREAM_WIDTH;
mycamera->imageDescription->height=D1_STREAM_HEIGHT;
}else if(cam_state==1){ //cámara vertical
frame=cv::Mat(D1_VERTSTREAM_WIDTH,D1_VERTSTREAM_HEIGHT,CV_8UC3,(void*)buffer);
mycamera->imageDescription->width=D1_VERTSTREAM_WIDTH;
mycamera->imageDescription->height=D1_VERTSTREAM_HEIGHT;
}
vp_os_mutex_unlock(&video_lock);
[7] modificado_horinzontal:
http://jderobot.org/store/amartinflorido/uploads/images/2_modifcado_hor.png
[8] modificado_vertical:
http://jderobot.org/store/amartinflorido/uploads/images/3_mod_vert.png
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20130721/e59f4e27/attachment.htm 


More information about the Jde-developers mailing list