C++Guns – RoboBlog blogging the bot

02.02.2015

normalized-rgb

Filed under: Allgemein — Tags: , — Thomas @ 11:02

Als ich gestern etwas mit OpenCV gearbeitet habe, bin ich auf eine
interesannte Seite gestossen [1] . Es wird dort von normailsierten RGB
geredet. Dabei wird getrennt für jeden Kanal, der Pixelwert durch die
Summe des Pixels über alle 3 Kanäle geteilt.

R’ = R/(R+G+B)
G’ = G/(R+G+B)
B’ = B/(R+G+B)

Dabei geht die Lichtinformation im Bild verloren. Ich finde das eine
interesannte Ausgangslage für weitere Berechnungen. Oft ist doch nur die
Farbe einzelner Objekte wichtig, nicht aber wie sie beleuchtet wurden.

Es sind nur noch 2 Byte pro Pixel, statt 3 Byte, notwenig.
R' + G' + B'=1
B' = 1 - R' - G'

Ein Angabe von 2 der 3 Werte ist also hinreichend. Damit kann der Farbort
charakterisiert werden, nicht aber die absolute Intensit¨t des Farbreizes. Das
heißt die Länge des Farbvektors wird nicht angegeben.

[1] http://www.aishack.in/tutorials/normalized-rgb/

11.07.2011

Einstellbare Sättigung im RGB Farbraum

Filed under: Allgemein — Tags: — Thomas @ 22:07

saettigungRGB

Aus http://www.inf.fu-berlin.de/inst/ag-ki/rojas_home/documents/Betreute_Arbeiten/Diplomarbeit_Seifert.pdf D. Seifert: Automatische Farbkalibrierung fußballspielender Roboter (Diplomarbeit)

Für s = 1 passiert garnichts. Für s > 1 wird der Mittelwert der R G B Komponenten von den einzelnen Farbkanälen abgezogen. Aber bei s = 0 wird es interessant. Dann kommt als Ergebnis einfach ein Graubild raus. Klar. Wenn die Farbsättigung weg ist, bleibt nur die Helligkeit =)

14.02.2011

OpenCV death (hot) Pixel im Bild entfernen

Filed under: Allgemein — Tags: , — Thomas @ 14:02

Da meine ca. 11 Jahre alte Webcam mitlerweile ein paar kaputte Pixel hat, die einfach nur weiß sind, habe ich mir überlegt was man dagegen tun kann. Eine Möglichkeit wäre, die Pixel zu erkennen und durch den Median der umliegenden Pixel zu ersetzten.

Um die Pixel zu erkennen macht man einfach ein paar Aufnahmen im dunkeln (oder hält die Hand vor die Kamera). Die kaputten Pixel heben sich deutlich vom Mittelwert ab. Anschliessend kann man das Bild binarisieren. Eine brauchbare Schwelle ist Mittelwert + 3 * Standardabweichung. Dann kommen wirklich nur Ausreisser durch. Anschliessend werden diese Pixel im original Bild durch ihren Median ersetzt.

Die Umsetzung in OpenCV ist etwas eklig. Es müssen mehrere Zwischenbilder erstellt werden. Und vorallem akzeptiert die Filterfunktion keine Masken. Es kann also nur auf das gesammte Bild der Median angewand werden. Wenn man aber anschliessend alle nicht-kaputten Pixel wieder zurück kopiert, ist das Resulatat das selbe.

hotPixelRemoval

Code gibts leider keinen, weil zu unschön von mir umgesetzt. Werde mich demnächst mal mit OpenCV Version 2 beschäftigen. In der Hoffnung, dass man dort das ganze schöner umsetzten kann.

27.01.2011

OpenCV Mittelwert der Farben in einem Video

Filed under: Allgemein — Tags: , — Thomas @ 01:01

Schaut euch mal dieses geniale Video an
http://www.youtube.com/watch?v=NtoYuwmTzt0

Wird das Video nicht zwischendrin irgendwie blasser? Es kommt mir gerade so vor. Hmmm man könnte ja mal die Farben analysieren. Also jedes einzelne Frame in den HSV (H Farbwert, S Sättigung, V Wert) umrechnen, den Mittelwert über alle Pixel bilden und dann grafisch auftragen.

Gesagt, getan.

mittelwertfarbe

Auf der X-Achse ist die Framenummer aufgetragen. Auf der Y-Achse HSV. Die rote Kurve ist H, grün S und blau V.
Man kann deutlich den Vor- und Abspann erkennen. Sonst bleiben die Werte relativ gleich. Die Kamera bewegt sich aber auch nicht.
Aber drei mal geht die Sättigung runter. Das Bild wird blass und bläulicher. Wie vermutet :)

Schön sind auch noch die ganzen Sprünge zu erkennen, wenn das Bild schnell ein und ausgeblendet wird.

Und hier mein quick&dirty Programm. Habe mplayer genutzt um an die einzelnen Frames zu kommen, da openCV Version 1 so sein Probleme mit Linux und avi hat.

mplayer ../Equilibrium\ -\ Unbesiegt\ Piano\ Cover.flv -vo jpeg -ao null

#include < stdio.h >
#include < stdlib.h >

#include < cv.h >
#include < highgui.h >

#define getPixel(img,x,y) (((uchar*)(img->imageData + img->widthStep*(y)))[x])
#define putPixel(img,x,y,color) (((uchar*)(img->imageData + img->widthStep*(y)))[x] = color)

#define getPixelB(img,x,y) (((uchar*)(img->imageData + img->widthStep*(y)))[x*3])
#define putPixelB(img,x,y,color) (((uchar*)(img->imageData + img->widthStep*(y)))[x*3] = color)

#define getPixelG(img,x,y) (((uchar*)(img->imageData + img->widthStep*(y)))[(x)*3+1])
#define putPixelG(img,x,y,color) (((uchar*)(img->imageData + img->widthStep*(y))) [(x)*3+1] = color)

#define getPixelR(img,x,y) (((uchar*)(img->imageData + img->widthStep*(y)))[(x)*3+2])
#define putPixelR(img,x,y,color) (((uchar*)(img->imageData + img->widthStep*(y)))[(x)*3+2] = color)

using namespace std;

int main()
{
char filename[18] ;
IplImage *image = 0;
IplImage* hsv = 0;
cvNamedWindow("original",1);

int i = 1;
snprintf(filename, 18,"jpg/%08d.jpg",i++);
image = cvLoadImage(filename);
hsv = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 );

IplImage* h_plane = cvCreateImage( cvGetSize( image ), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize( image ), 8, 1 );
IplImage* v_plane = cvCreateImage( cvGetSize( image ), 8, 1 );

cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

while(1)
{
snprintf(filename, 18,"jpg/%08d.jpg",i++);

image = cvLoadImage(filename);
if(image == 0)
break;

cvCvtColor( image, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

float meanh = 0, means = 0, meanv = 0;
for(int y = 0; y < hsv->height; y++)
{
for(int x = 0; x < hsv->width; x++)
{
meanh += getPixel(h_plane, x, y);
means += getPixel(s_plane, x, y);
meanv += getPixel(v_plane, x, y);
}
}
meanh /= image->width * image->height;
means /= image->width * image->height;
meanv /= image->width * image->height;

printf("%f %f %f\n", meanh, means, meanv);

cvShowImage("original", image);

cvWaitKey(10);

cvReleaseImage(&image);

}
}

Wer gern den QtCreator benutzt, hier noch mein .pro File.

SOURCES += main.cpp

INCLUDEPATH += /usr/include/opencv
CONFIG += link_pkgconfig
PKGCONFIG += opencv

Und hier mal ein "normales" Video
mittelwertfarbe2

23.08.2010

Objekterkennung mit OpenCV

Filed under: Allgemein — Tags: , — Thomas @ 20:08

Gerade beim aufräumen habe ich dieses alte Video von mir gefunden
http://www.dailymotion.com/video/xejjoz_objekterkennung-mit-opencv_tech

Mit OpenCV das Webcam Bild abgreifen und dann den Pavlidis Algo. laufen lassen (google it). Den Mittelpunkt merken und im nächsten Frame dort das Objekt wieder suchen. So ungefährt jedenfalls funktioniert es.

Der Code ist unter aller Sau. Müsste mir eigentlich mal die Zeit nehmen und das ordentlich machen. Immerhin boomen ja diese Gestik-Erkennungs-Geräte gerade. Besonders für Spiele ganz toll. Die Technik gibts schon lange, nur auf einmal wird sie populär.

19.08.2010

webcamviewer

Filed under: programmieren — Tags: — Thomas @ 13:08

Wer kennt das nicht, man will nur mal schnell mit der Webcam ein Bild machen.

Also startet man das beste Programm aller Zeiten dafür: xawtv [1] Der Author dieses Programmes benutzte nämlich nicht v4l (Video for Linux), sondern entwickelte seine eigenen Funktionen. Das hatte den Vorteil, dass dieses Programm wirklich immer, auch bei den schrottigsten Webcams ein Bild lieferte. Alle anderen Programme versagten. Was zugegeben an den teilweise schlechten Webcamtreibern liegt.

Aber die goldenen Zeiten nähren sich ihrem Ende. xawtv wird schon lange nicht mehr weiter enwickelt. Und mit der neusten Kernel (2.6.35.2) bekomme ich zwar ein Bild, kann es aber nicht mehr abspeichern.

Aber man kann sich ja selbst helfen. Anstatt irgendein doofes Programm zu suchen, welches überladen ist, zu lange braucht beim starten, zu kompliziert zu bedienen ist oder Probleme mit der Webcam hat, habe ich mir einfach mein eigenens geschrieben.

Mein Programm mit dem simplen Namen "webcamviewer" benutzt OpenCv um an die Bilder der Kamera zu kommen. Man startet das Programm, bekommt sofort ein Livestream der Kamera und mit der Taste "j" wird ein jpg Bild abgespeichert mit passenden Timestamp als Dateiname. Einfacher gehts nun wirklich nicht mehr :)

webcamviewer-0.2.tar.gz

[1] http://linux.bytesex.org/xawtv/

Powered by WordPress