Hallo,
ich arbeite seit längerem mit dem NGW100. Auf dem NGW100 ist ein Kameraboard
(Framos CM1314YFM) über die serielle Schnittstelle des NGW 100 angeschlossen.
Meine Aufgabe ist es mit Hilfe der Kamera kreisförmige Objekte(z.B.
Luftaballons) mit Hilfe von OpenCV zu lokalisieren. Das habe ich auch ganz gut
hinbekommen, aber über die Webcam meines Laptops.
Nun soll ich den vorhandenen Code auf das NGW100 Board portieren. Genau hier
habe ich ein Problem, welches vermutlich an der Adressierung liegt.
Die Kamera nimmt Fotos in dem VYUY Format auf und es soll in den RGB Farbraum
konvertiert werden, da OpenCV nur mit dem RGB Format arbeiten kann.
Fehlerbeschreibung:
Die Funktion yuv422 bekommt als erstes Parameter, die line_yuv Werte(eigentlich
vyuy) übergeben und soll nach der Berechnung die Werte als Ausgabeparameter an
line_rgb abspeichern.
Der Code:
static void yuv422_to_rgb(unsigned char *src, unsigned char *dst,
unsigned int nr_pixels)
{
unsigned int i;
int y1, y2, u, v;
int x = 0;
for (i = 0; i < nr_pixels; i += 2)
{
y2 = *src++;
v = *src++;
y1 = *src++;
u = *src++;
y1 -= 16;
u -= 128;
v -= 128;
y2 -= 16;
*dst++ = clip(( 298 * y1 + 409 * v + 128) >> 8);
*dst++ = clip(( 298 * y1 - 100 * u - 208 * v + 128) >> 8);
*dst++ = clip(( 298 * y1 + 516 * u + 128) >> 8);
*dst++ = clip(( 298 * y2 + 409 * v + 128) >> 8);
*dst++ = clip(( 298 * y2 - 100 * u - 208 * v + 128) >> 8);
*dst++ = clip(( 298 * y2 + 516 * u + 128) >> 8);
if( x == 0)
{
//Diese Werte stimmen nicht mit den Werten von unten überein
printf("A: 1: %i, 2: %i, 3: %i, 4: %i, 5: %i, 6:%i\n",
dst[1], dst[2], dst[3], dst[4], dst[5], dst[6]);
x++;
}
}
}
int main()
{
.
.
.
unsigned char *line_rgb;
unsigned char *line_yuv;
line_rgb = (unsigned char *) calloc(image->width * 3,
sizeof(unsigned char));
line_yuv = (unsigned char *) image->buf;
yuv422_to_rgb(line_yuv, line_rgb, image->width);
//Diese Werte stimmen nicht mit den Werten von oben überein
printf("B: 1: %i, 2: %i, 3: %i, 4: %i, 5: %i, 6: %i,\n",
line_rgb[0], line_rgb[1], line_rgb[2], line_rgb[3],
line_rgb[4], line_rgb[5]);
.
.
.
}
Ich bin mir sicher, dass es ein kleiner Fehler ist, aber leider komme ich
einfach nicht zu einer Lösung.
Vielen Dank für eure Hilfe...
Gruss aus Berlin
ich arbeite seit längerem mit dem NGW100. Auf dem NGW100 ist ein Kameraboard
(Framos CM1314YFM) über die serielle Schnittstelle des NGW 100 angeschlossen.
Meine Aufgabe ist es mit Hilfe der Kamera kreisförmige Objekte(z.B.
Luftaballons) mit Hilfe von OpenCV zu lokalisieren. Das habe ich auch ganz gut
hinbekommen, aber über die Webcam meines Laptops.
Nun soll ich den vorhandenen Code auf das NGW100 Board portieren. Genau hier
habe ich ein Problem, welches vermutlich an der Adressierung liegt.
Die Kamera nimmt Fotos in dem VYUY Format auf und es soll in den RGB Farbraum
konvertiert werden, da OpenCV nur mit dem RGB Format arbeiten kann.
Fehlerbeschreibung:
Die Funktion yuv422 bekommt als erstes Parameter, die line_yuv Werte(eigentlich
vyuy) übergeben und soll nach der Berechnung die Werte als Ausgabeparameter an
line_rgb abspeichern.
Der Code:
static void yuv422_to_rgb(unsigned char *src, unsigned char *dst,
unsigned int nr_pixels)
{
unsigned int i;
int y1, y2, u, v;
int x = 0;
for (i = 0; i < nr_pixels; i += 2)
{
y2 = *src++;
v = *src++;
y1 = *src++;
u = *src++;
y1 -= 16;
u -= 128;
v -= 128;
y2 -= 16;
*dst++ = clip(( 298 * y1 + 409 * v + 128) >> 8);
*dst++ = clip(( 298 * y1 - 100 * u - 208 * v + 128) >> 8);
*dst++ = clip(( 298 * y1 + 516 * u + 128) >> 8);
*dst++ = clip(( 298 * y2 + 409 * v + 128) >> 8);
*dst++ = clip(( 298 * y2 - 100 * u - 208 * v + 128) >> 8);
*dst++ = clip(( 298 * y2 + 516 * u + 128) >> 8);
if( x == 0)
{
//Diese Werte stimmen nicht mit den Werten von unten überein
printf("A: 1: %i, 2: %i, 3: %i, 4: %i, 5: %i, 6:%i\n",
dst[1], dst[2], dst[3], dst[4], dst[5], dst[6]);
x++;
}
}
}
int main()
{
.
.
.
unsigned char *line_rgb;
unsigned char *line_yuv;
line_rgb = (unsigned char *) calloc(image->width * 3,
sizeof(unsigned char));
line_yuv = (unsigned char *) image->buf;
yuv422_to_rgb(line_yuv, line_rgb, image->width);
//Diese Werte stimmen nicht mit den Werten von oben überein
printf("B: 1: %i, 2: %i, 3: %i, 4: %i, 5: %i, 6: %i,\n",
line_rgb[0], line_rgb[1], line_rgb[2], line_rgb[3],
line_rgb[4], line_rgb[5]);
.
.
.
}
Ich bin mir sicher, dass es ein kleiner Fehler ist, aber leider komme ich
einfach nicht zu einer Lösung.
Vielen Dank für eure Hilfe...
Gruss aus Berlin