Discussion:
compiling an example program
Sol Pedre
2014-04-10 18:19:06 UTC
Permalink
Hello,

I have succesfully installed aravis and used the arv-viewer to see the
input from a DFK 23GM021 The Imaging Source Gige camera.

Now I am trying to use this camera from a C/C++ code that process images.
To start, i am reading the aravis reference manual, and i am trying to
compile the example in the ArvCamera reference page (I paste it below).

However, i am finding several errors, i guess i am missing some library
bindings and others. The first two errors are:

Invalid arguments ' Candidates are: void arv_camera_set_region(_ArvCamera
*, ?, ?, ?, ?)

and

Invalid arguments '
Candidates are: void arv_stream_set_emit_signals(_ArvStream *, ?)


These both functions take gint as parameters, and the code passes gint, but
it does not work.

Please tell me which libraries i should be linking with and where they
should be, and also any light you can shed in those errors...

Thank you very much!!
Sol


---------------

Code:


#include <arv.h>
#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>

typedef struct {
GMainLoop *main_loop;
int buffer_count;
} ApplicationData;

static gboolean cancel = FALSE;

static void
set_cancel (int signal)
{
cancel = TRUE;
}

static void
new_buffer_cb (ArvStream *stream, ApplicationData *data)
{
ArvBuffer *buffer;

buffer = arv_stream_try_pop_buffer (stream);
if (buffer != NULL) {
if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
data->buffer_count++;
/* Image processing here */
arv_stream_push_buffer (stream, buffer);
}
}

static gboolean
periodic_task_cb (void *abstract_data)
{
ApplicationData *data = (ApplicationData*)abstract_data;

printf ("Frame rate = %d Hz\n", data->buffer_count);
data->buffer_count = 0;

if (cancel) {
g_main_loop_quit (data->main_loop);
return FALSE;
}

return TRUE;
}

static void
control_lost_cb (ArvGvDevice *gv_device)
{
/* Control of the device is lost. Display a message and force
application exit */
printf ("Control lost\n");

cancel = TRUE;
}

int
main (int argc, char **argv)
{
ApplicationData data;
ArvCamera *camera;
ArvStream *stream;
ArvBuffer *buffer;
int i;

data.buffer_count = 0;

/* Mandatory glib type system initialization */
//arv_g_type_init();
g_type_init();
/* Instantiation of the first available camera */
camera = arv_camera_new (NULL);

if (camera != NULL) {
void (*old_sigint_handler)(int);
gint payload;
guint software_trigger_source = 0;

/* Set region of interrest to a 200x200 pixel area */
arv_camera_set_region(camera, (gint)0, (gint)0, (gint)200,
(gint)200);
/* Set frame rate to 10 Hz */
arv_camera_set_frame_rate (camera, 10.0);
/* retrieve image payload (number of bytes per image) */
payload = arv_camera_get_payload (camera);

/* Create a new stream object */
stream = arv_camera_create_stream (camera, NULL, NULL);
if (stream != NULL) {
/* Push 50 buffer in the stream input buffer queue */
for (i = 0; i < 50; i++)
arv_stream_push_buffer (stream, arv_buffer_new (payload,
NULL));

/* Start the video stream */
arv_camera_start_acquisition (camera);

/* Connect the new-buffer signal */
g_signal_connect (stream, "new-buffer", G_CALLBACK
(new_buffer_cb), &data);
/* And enable emission of this signal (it's disabled by default
for performance reason) */
arv_stream_set_emit_signals(stream, TRUE);

/* Connect the control-lost signal */
g_signal_connect (arv_camera_get_device (camera),
"control-lost",
G_CALLBACK (control_lost_cb), NULL);

/* Install the callback for frame rate display */
g_timeout_add_seconds (1, periodic_task_cb, &data);

/* Create a new glib main loop */
data.main_loop = g_main_loop_new (NULL, FALSE);

old_sigint_handler = signal (SIGINT, set_cancel);

/* Run the main loop */
g_main_loop_run (data.main_loop);

signal (SIGINT, old_sigint_handler);

g_main_loop_unref (data.main_loop);

/* Stop the video stream */
arv_camera_stop_acquisition (camera);

g_object_unref (stream);
} else
printf ("Can't create stream thread (check if the device is not
already used)\n");

g_object_unref (camera);
} else
printf ("No camera found\n");

return 0;
}
Emmanuel Pacaud
2014-04-11 09:09:08 UTC
Permalink
Hi,
Post by Sol Pedre
However, i am finding several errors, i guess i am missing some
Invalid arguments ' Candidates are: void
arv_camera_set_region(_ArvCamera *, ?, ?, ?, ?)
and
Invalid arguments '
Candidates are: void arv_stream_set_emit_signals(_ArvStream *, ?)
What gcc command line have you used ?

Could you send the full compilation output please ?

Thanks.

Cheers,

Emmanuel.
Martin Kielhorn
2014-04-11 12:16:35 UTC
Permalink
Hi Sol,
perhaps you would like to have a look on my code:

https://github.com/plops/arduino_due_lisp/blob/master/arvexample.c

I added fouriertransforms and have to compile like this (as currently in
the makefile):
gcc -g -O2 -o arv-example arvexample.c -MD -MP -MF -pthread
-I/usr/include/aravis-0.4 -I/usr/lib/glib-2.0/include
-I/usr/include/glib-2.0 -lm -L/usr/lib -lgio-2.0 -lgobject-2.0 -lxml2
-lgthread-2.0 -pthread -lrt -lglib-2.0 -lz -laravis-0.4 -lglfw -lGL
-lfftw3 -lfftw3_threads

Note, that I'm not sure if this code actually works.
I remember getting fed up with C because there were so many things I didn't
understand
from the docs and had to find out by experiment. Therefore, I switched to
Common Lisp (using Clozure CL) rather quickly.


Regards, Martin
Post by Sol Pedre
Hello,
I have succesfully installed aravis and used the arv-viewer to see the
input from a DFK 23GM021 The Imaging Source Gige camera.
Now I am trying to use this camera from a C/C++ code that process images.
To start, i am reading the aravis reference manual, and i am trying to
compile the example in the ArvCamera reference page (I paste it below).
However, i am finding several errors, i guess i am missing some library
Invalid arguments ' Candidates are: void arv_camera_set_region(_ArvCamera
*, ?, ?, ?, ?)
and
Invalid arguments '
Candidates are: void arv_stream_set_emit_signals(_ArvStream *, ?)
These both functions take gint as parameters, and the code passes gint,
but it does not work.
Please tell me which libraries i should be linking with and where they
should be, and also any light you can shed in those errors...
Thank you very much!!
Sol
---------------
#include <arv.h>
#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
typedef struct {
GMainLoop *main_loop;
int buffer_count;
} ApplicationData;
static gboolean cancel = FALSE;
static void
set_cancel (int signal)
{
cancel = TRUE;
}
static void
new_buffer_cb (ArvStream *stream, ApplicationData *data)
{
ArvBuffer *buffer;
buffer = arv_stream_try_pop_buffer (stream);
if (buffer != NULL) {
if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
data->buffer_count++;
/* Image processing here */
arv_stream_push_buffer (stream, buffer);
}
}
static gboolean
periodic_task_cb (void *abstract_data)
{
ApplicationData *data = (ApplicationData*)abstract_data;
printf ("Frame rate = %d Hz\n", data->buffer_count);
data->buffer_count = 0;
if (cancel) {
g_main_loop_quit (data->main_loop);
return FALSE;
}
return TRUE;
}
static void
control_lost_cb (ArvGvDevice *gv_device)
{
/* Control of the device is lost. Display a message and force
application exit */
printf ("Control lost\n");
cancel = TRUE;
}
int
main (int argc, char **argv)
{
ApplicationData data;
ArvCamera *camera;
ArvStream *stream;
ArvBuffer *buffer;
int i;
data.buffer_count = 0;
/* Mandatory glib type system initialization */
//arv_g_type_init();
g_type_init();
/* Instantiation of the first available camera */
camera = arv_camera_new (NULL);
if (camera != NULL) {
void (*old_sigint_handler)(int);
gint payload;
guint software_trigger_source = 0;
/* Set region of interrest to a 200x200 pixel area */
arv_camera_set_region(camera, (gint)0, (gint)0, (gint)200,
(gint)200);
/* Set frame rate to 10 Hz */
arv_camera_set_frame_rate (camera, 10.0);
/* retrieve image payload (number of bytes per image) */
payload = arv_camera_get_payload (camera);
/* Create a new stream object */
stream = arv_camera_create_stream (camera, NULL, NULL);
if (stream != NULL) {
/* Push 50 buffer in the stream input buffer queue */
for (i = 0; i < 50; i++)
arv_stream_push_buffer (stream, arv_buffer_new (payload,
NULL));
/* Start the video stream */
arv_camera_start_acquisition (camera);
/* Connect the new-buffer signal */
g_signal_connect (stream, "new-buffer", G_CALLBACK
(new_buffer_cb), &data);
/* And enable emission of this signal (it's disabled by
default for performance reason) */
arv_stream_set_emit_signals(stream, TRUE);
/* Connect the control-lost signal */
g_signal_connect (arv_camera_get_device (camera),
"control-lost",
G_CALLBACK (control_lost_cb), NULL);
/* Install the callback for frame rate display */
g_timeout_add_seconds (1, periodic_task_cb, &data);
/* Create a new glib main loop */
data.main_loop = g_main_loop_new (NULL, FALSE);
old_sigint_handler = signal (SIGINT, set_cancel);
/* Run the main loop */
g_main_loop_run (data.main_loop);
signal (SIGINT, old_sigint_handler);
g_main_loop_unref (data.main_loop);
/* Stop the video stream */
arv_camera_stop_acquisition (camera);
g_object_unref (stream);
} else
printf ("Can't create stream thread (check if the device is
not already used)\n");
g_object_unref (camera);
} else
printf ("No camera found\n");
return 0;
}
--
Martin Kielhorn
Leibniz-Institute of Photonic Technology, Albert-Einstein Str. 9, 07745
Jena,
Germany
Tel.: +49 (0) 3641 206 245
Randall Division of Cell & Molecular Biophysics, King's College London, NHH,
Guy's Campus, London SE1 1UL, U.K.
tel: +44 (0) 207 848 6519, fax: +44 (0) 207 848 6435
Sol Pedre
2014-04-11 17:03:00 UTC
Permalink
Hi Emanuel and Martin,

Thank you very much!
I have the code running now, I will try to make some processing and will
surely need more help.
The g++ command line I used is:

g++ -I/home/robotica/Sol/camaras/drivers/gige/aravis/src
-I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -O0 -g3
-Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o"
"../main.cpp"

and

g++ -L/usr/lib -L/home/robotica/Sol/camaras/drivers/gige/aravis/src
-L/usr/local/lib -o "test_gige" ./main.o -lglib-2.0 -laravis-0.4

Cheers!
Sol
Post by Martin Kielhorn
Hi Sol,
https://github.com/plops/arduino_due_lisp/blob/master/arvexample.c
I added fouriertransforms and have to compile like this (as currently in
gcc -g -O2 -o arv-example arvexample.c -MD -MP -MF -pthread
-I/usr/include/aravis-0.4 -I/usr/lib/glib-2.0/include
-I/usr/include/glib-2.0 -lm -L/usr/lib -lgio-2.0 -lgobject-2.0 -lxml2
-lgthread-2.0 -pthread -lrt -lglib-2.0 -lz -laravis-0.4 -lglfw -lGL
-lfftw3 -lfftw3_threads
Note, that I'm not sure if this code actually works.
I remember getting fed up with C because there were so many things I
didn't understand
from the docs and had to find out by experiment. Therefore, I switched to
Common Lisp (using Clozure CL) rather quickly.
Regards, Martin
Hello,
Post by Sol Pedre
I have succesfully installed aravis and used the arv-viewer to see the
input from a DFK 23GM021 The Imaging Source Gige camera.
Now I am trying to use this camera from a C/C++ code that process images.
To start, i am reading the aravis reference manual, and i am trying to
compile the example in the ArvCamera reference page (I paste it below).
However, i am finding several errors, i guess i am missing some library
Invalid arguments ' Candidates are: void arv_camera_set_region(_ArvCamera
*, ?, ?, ?, ?)
and
Invalid arguments '
Candidates are: void arv_stream_set_emit_signals(_ArvStream *, ?)
These both functions take gint as parameters, and the code passes gint,
but it does not work.
Please tell me which libraries i should be linking with and where they
should be, and also any light you can shed in those errors...
Thank you very much!!
Sol
---------------
#include <arv.h>
#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
typedef struct {
GMainLoop *main_loop;
int buffer_count;
} ApplicationData;
static gboolean cancel = FALSE;
static void
set_cancel (int signal)
{
cancel = TRUE;
}
static void
new_buffer_cb (ArvStream *stream, ApplicationData *data)
{
ArvBuffer *buffer;
buffer = arv_stream_try_pop_buffer (stream);
if (buffer != NULL) {
if (buffer->status == ARV_BUFFER_STATUS_SUCCESS)
data->buffer_count++;
/* Image processing here */
arv_stream_push_buffer (stream, buffer);
}
}
static gboolean
periodic_task_cb (void *abstract_data)
{
ApplicationData *data = (ApplicationData*)abstract_data;
printf ("Frame rate = %d Hz\n", data->buffer_count);
data->buffer_count = 0;
if (cancel) {
g_main_loop_quit (data->main_loop);
return FALSE;
}
return TRUE;
}
static void
control_lost_cb (ArvGvDevice *gv_device)
{
/* Control of the device is lost. Display a message and force
application exit */
printf ("Control lost\n");
cancel = TRUE;
}
int
main (int argc, char **argv)
{
ApplicationData data;
ArvCamera *camera;
ArvStream *stream;
ArvBuffer *buffer;
int i;
data.buffer_count = 0;
/* Mandatory glib type system initialization */
//arv_g_type_init();
g_type_init();
/* Instantiation of the first available camera */
camera = arv_camera_new (NULL);
if (camera != NULL) {
void (*old_sigint_handler)(int);
gint payload;
guint software_trigger_source = 0;
/* Set region of interrest to a 200x200 pixel area */
arv_camera_set_region(camera, (gint)0, (gint)0, (gint)200,
(gint)200);
/* Set frame rate to 10 Hz */
arv_camera_set_frame_rate (camera, 10.0);
/* retrieve image payload (number of bytes per image) */
payload = arv_camera_get_payload (camera);
/* Create a new stream object */
stream = arv_camera_create_stream (camera, NULL, NULL);
if (stream != NULL) {
/* Push 50 buffer in the stream input buffer queue */
for (i = 0; i < 50; i++)
arv_stream_push_buffer (stream, arv_buffer_new (payload,
NULL));
/* Start the video stream */
arv_camera_start_acquisition (camera);
/* Connect the new-buffer signal */
g_signal_connect (stream, "new-buffer", G_CALLBACK
(new_buffer_cb), &data);
/* And enable emission of this signal (it's disabled by
default for performance reason) */
arv_stream_set_emit_signals(stream, TRUE);
/* Connect the control-lost signal */
g_signal_connect (arv_camera_get_device (camera),
"control-lost",
G_CALLBACK (control_lost_cb), NULL);
/* Install the callback for frame rate display */
g_timeout_add_seconds (1, periodic_task_cb, &data);
/* Create a new glib main loop */
data.main_loop = g_main_loop_new (NULL, FALSE);
old_sigint_handler = signal (SIGINT, set_cancel);
/* Run the main loop */
g_main_loop_run (data.main_loop);
signal (SIGINT, old_sigint_handler);
g_main_loop_unref (data.main_loop);
/* Stop the video stream */
arv_camera_stop_acquisition (camera);
g_object_unref (stream);
} else
printf ("Can't create stream thread (check if the device is
not already used)\n");
g_object_unref (camera);
} else
printf ("No camera found\n");
return 0;
}
--
Martin Kielhorn
Leibniz-Institute of Photonic Technology, Albert-Einstein Str. 9, 07745
Jena,
Germany
Tel.: +49 (0) 3641 206 245
Randall Division of Cell & Molecular Biophysics, King's College London, NHH,
Guy's Campus, London SE1 1UL, U.K.
tel: +44 (0) 207 848 6519, fax: +44 (0) 207 848 6435
Loading...