Adressierungsprobleme auf dem NGW100

thulfikar

Grünschnabel
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
 
Hi.

Du setzt den dst Zeiger doch immer weiter. Beim Start der Funktion gilt dst == &line_rgb[0].

Nach den *dst++ Zeilen gilt doch aber dst == &line_rgb[6].

Du gibst in der Funktion also line_rgb[7], line_rgb[8], line_rgb[9] usw. aus, in main() allerdings line_rgb[0], line_rgb[1] usw.

Gruß
 
Zurück