PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++ Beispielprogramme mit USB Cam und openCV?



HaWe
09.03.2017, 10:57
hallo
fühlt sich jemand in der Lage, C/C++ Beispielprogramme mit USB Cam und openCV samt Installationsanleitungen zu schreiben?

Die Programme sollen in der Lage sein, z.B.

Farben auf Bällen zu erkennen
https://www.youtube.com/watch?v=MWK55A0RH0U

die Farbverteilungen auf einem Rubik's Cube zu erkennen wie hier
https://www.facebook.com/groups/legomindstorms/permalink/786070768207818/

oder Formen auf Schildern zu erkennen wir hier, um daraf zu reagieren:
https://www.youtube.com/watch?v=fns19y9NOpM

alles das ist mit Python wohl recht einfach möglich, es wird aber C/C++ Code benötigt, da alle übrigen (Roboter-)Funktionen ebenfalls in C programmiert werden.
Es geht auch nur um den openCV-Image-Processing-Teil, nicht um die anschließende Reaktion der Machine/des Roboters.

(ergänzt: ) die libs und API wrapper müssen allerdings funktionieren per einfachem
#include <zzzz>
und verlinken mit simplem
make g++ plus -lxxxx und /oder -Izzzz
in einer simplen Kommandozeile, ohne makefile und ohne cmake etc. (also kompatibel zur Geany IDE mit compile/build settings)

Fühlt sich dazu jemand zunächst einmal grundsätzlich in der Lage?
Über die Umsetzung (bezahlt oder ntl gern als Freeware) kann man dann anschließend reden, und ich helfe ntl jederzeit gerne im Rahmen meiner Anfänger-Kenntnisse mit!)

shedepe
10.03.2017, 18:17
Hey.
1. Kamera einlesen:
(Auch nur von hier geklaut: http://answers.opencv.org/question/1/how-can-i-get-frames-from-my-webcam/)


#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap;
// open the default camera, use something different from 0 otherwise;
// Check VideoCapture documentation.
if(!cap.open(0))
return 0;
for(;;)
{
Mat frame;
cap >> frame;
if( frame.empty() ) break; // end of video stream
imshow("this is you, smile! :)", frame);
if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
}
// the camera will be closed automatically upon exit
// cap.close();
return 0;
}


Alternativ kann man auch -1 für eine beliebige Kamera angeben bei cap.open oder einen Dateinamen für ein Video.

2. Bälle. Dort wurde vermutlich eine Hough Circle Transformation angewendet in Kombination mit einem Farbtreshold.
Hough Circles kann man direkt das Beispiel nehmen: http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html
Um den Circle rauszuschneiden: http://answers.opencv.org/question/18784/crop-image-using-hough-circle/
Treshold kann man die inRange Funktion verwenden: (Auch geklaut von stackoverflow : https://stackoverflow.com/questions/26218280/thresholding-rgb-image-in-opencv)



cv::Mat image = cv::imread("bird.jpg"); //Oder eben aus der Video capture einlesen

if (image.empty())
{
std::cout << "> This image is empty" << std::endl;
return 1;
}cv::Mat output;
cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output);
cv::imshow("output", output);



3. Das kann tricky sein. Vorgehen ist in etwa so:
Houghlines transformation anwenden. Ergibt Array mit gefindenen Linien.
http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html
Dann iteriert man durch das Array mit linien durch. Schaut wo sich zwei Linien schneiden und ob sie senkrecht zu einander stehen (Steigung * Steigung = -1). Dann hat man ein Array aus Schnittpunkten. Dort sind die Schnittpunkte die jeweils an nächsten zueinander sind Teile eines Rechtecks.
Dann schneidet man wie bei 2. Den Rechteck Teil raus und lässt verschiedene inRange Funktionen drüber laufen (Also einmal für Grün, Gelb,Blau usw.). inRange erzeugt ein Binärbild (Also weiß für Pixel unter dem Treshold, Schwarz drüber). Auf diesem Binärbild zählt man alle Schwarzen Pixel und vergleicht sie mit der Gesamtanzahl von Pixeln des Auschnitts. Wenn mehr als 70% Schwarz sind kann man sagen man hat die Farbe gefunden.



int TotalNumberOfPixels = bwImage.rows * bwImage.cols;
int ZeroPixels = TotalNumberOfPixels - countNonZero(bwImage);


4. Kann man mit Feature Detection probieren. Aktuelle Ansätze würden vermutlich neuronale Netze tranieren. Aber das ist mehr als dir irgendjemand mal schnell coden wird.

Für fertige Beispielprogramme reicht bei mir die Zeit nicht aus zum schreiben. Vorallem besteht 80% der Zeit darin Parameter zu optimieren. Und manchmal muss man verschiedene Ansätze durchprobieren.
Die C++ Api von OpenCv ist aber auch nicht schwerer als die Python API und mindestens genauso gut dokumentiert. Muss man sich halt reinlesen.

PS. Wenn du ROS verwendest kannst du auch ganz einfach die Bildverarbeitung in Python schreiben und den Rest in C/C++

HaWe
10.03.2017, 19:00
dankeschön, das sieht ja schon sehr gut aus!

Eine Frage vorher, bevor ich was falsch installiere:

- Muss ich für die Cam (eine alte Logicam USB) vorab Treiber installieren (ggf welche) ?

- nach welcher Installationsanleitung muss ich für openVG vorgehen, inkl welche Zusatzlibs (uv4l ? raspicam ? cv::Mat? oder noch was anders?)
(Ich hatte schon öfters mal falsche Anleitungen im Web befolgt, und hinterher ging gar nichts mehr....)

shedepe
11.03.2017, 08:58
Linux oder Windows?

Linux brauchst du keinen Treiber.
Ansonsten apt-get install libopencv-dev

HaWe
11.03.2017, 12:24
hey, nein, schon richtig: für den Pi, also für Linux.

Habe es so gemacht, USB cam eingestöpselt, und das allererste Programm versucht zu erstellen,


#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap;
// open the default camera, use something different from 0 otherwise;
// Check VideoCapture documentation.
if(!cap.open(0))
return 0;
for(;;)
{
Mat frame;
cap >> frame;
if( frame.empty() ) break; // end of video stream
imshow("this is you, smile! :)", frame);
if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
}
// the camera will be closed automatically upon exit
// cap.close();
return 0;
}


per Geany compile/build settings wie hier angegeben, aber tonnenweise errors:


g++ -Wall -pthread -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -o "camtest" "camtest.c" -lshapes -L/opt/vc/lib -lOpenVG -lEGL -lwiringPi -lrt -lpigpio -lArduiPi_OLED (im Verzeichnis: /home/pi/programs/cam)

/tmp/ccQSKrEJ.o: In function `main':
camtest.c:(.text+0x68): undefined reference to `cv::VideoCapture::VideoCapture()'
camtest.c:(.text+0x78): undefined reference to `cv::VideoCapture::open(int)'
camtest.c:(.text+0x110): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
camtest.c:(.text+0x124): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
camtest.c:(.text+0x144): undefined reference to `cv::waitKey(int)'
camtest.c:(.text+0x198): undefined reference to `cv::VideoCapture::~VideoCapture()'
camtest.c:(.text+0x1dc): undefined reference to `cv::VideoCapture::~VideoCapture()'
camtest.c:(.text+0x1f0): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
/tmp/ccQSKrEJ.o: In function `cv::Mat::~Mat()':
camtest.c:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): undefined reference to `cv::fastFree(void*)'
/tmp/ccQSKrEJ.o: In function `cv::Mat::release()':
camtest.c:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x58): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
Kompilierung fehlgeschlagen.



wo soll man jetzt anfangen?
Sicher fehlen schon mal eine ganze Menge compile/build parameter.
Aber welche?

shedepe
11.03.2017, 12:45
Opencv empfiehlt, dass man CMake als Buildsystem verwendet.
Eine einfache CMakeLists.txt dazu sieht so aus:



cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

http://docs.opencv.org/3.1.0/db/df5/tutorial_linux_gcc_cmake.html

Bei Project trägt man den Namen des Projects ein.
Bei Add Executable trägt man 1. Den Namen der ausführbaren Datei ein die bei rauskommen soll und 2. Alle cpp Files die verwendet werden soll um diese Executable zu bauen.
Bei TargetLinkLibraries trägt man 1. Den Namen der Executable ein und 2. Alle Libraries gegen die man linken will.
OpenCV wird automatisch durch
find_package( OpenCV REQUIRED ) gefunden.

HaWe
11.03.2017, 12:47
cmake kann ich nicht, habe ich nicht und verstehe ich auch nicht.
makefile übrigens auch nicht.
Ich verwende ausschließlich Geany, hier kann man ja auch die compile- und die build-Parameter eingeben.
Mit Geany muss es also schon funktionieren.

shedepe
11.03.2017, 12:49
Ja kann es.
Dann musst du dir halt von pkgconfig die Flags geben lassen:
http://image.diku.dk/mediawiki/index.php/OpenCV

Ich würde trotzdem zu einem richtige Buildsystem (Sei es nur ein Makefile) raten, anstatt direkt aus dem Editor den Compiler aufzurufen. Buildsystem haben grade beim Auflösen vom Abhängigkeiten vorteile

HaWe
11.03.2017, 13:01
Dann musst du dir halt von pkgconfig die Flags geben lassen:

da hört das Verständnis schon bei mir auf.
welche Flags sind das?
In dem Link sehe ich die Bäume vor lauter Buchstabenwald nicht... ;)

ich werde auch leider totsicher bei Geany bleiben müssen, denn make, makefile und cmake übersteigen meine kognitiven Fähigkeiten...
es soll im Prinzip alles aus der Geany IDE heraus möglich sein, ohne diese integrierten Compile- und Build-Funktionen bin ich restlos verloren (und dazu ist die Geany IDE ja auch da, genau wie eine stark abgespeckte Eclipse oder Visual C Studio -IDE...)

HaWe
11.03.2017, 16:57
kann jemand helfen, welche Parameter oder flags man eingeben muss?
sowas in der Art wie -lopencv oder was noch oder was auch immer?

shedepe
11.03.2017, 17:48
Schau dir den Link doch zumindest an.
Wenn du
pkg-config --cflags opencv

ausführst siehst du welche Include Directories du brauchst

Mit
pkg-config --libs opencv
Welche Libraries du brauchst.

Das ist aber ohne dir zu nahe treten zu wollen Grundwissen was C/C++ Programmierung angehört und das kann man sich eigentlich recht schnell selbst erarbeiten, wenn man nur mal
kurz eine Suchmaschiene zu dem Thema anwirft.

HaWe
11.03.2017, 17:56
ich habe den Link gelesen, aber ich hatte keine Ahnung was das sollte mit pkg-config --cflags opencv, dass das überhaupt ein Befehl ist, den man dann auch noch eingeben muss, um ein verwertbares Ergebnis zu erhalten!
Warum geben die nicht einfach die Parameer an, die man braucht???

Ich nutze auch Geany nur so wie ich auch die Arduino IDE für C verwende, alles andere ist zu hoch für mich.
Aber dafür gibt es ja IDEs wie Geany.

shedepe
11.03.2017, 18:03
Weil Opencv ein Projekt ist, dass 1. modular aufgebaut ist. D.h. man kann nur das verwenden was man braucht. Das ist für viele embedded Projekte wichtig
2. ist opencv Plattform übergreifen. Andere Plattformen haben andere Gepflogenheiten wie libraries heißen und vorallem auch wo diese liegen. Unter Windows gibt man z.B. häufig absolute Pfade an
3. Kann so ein Update von Opencv gemacht werden, das z.B. eine Library in 2 einzelne zerlegt oder weitere hinzufügt und dein Projekt baut immer noch ohne dass du etwas anpassen musst.

--> Deshalb pkgconfig aus einem Makefile oder via CMake aufrufen.

HaWe
11.03.2017, 18:10
(aufgrund berechtigter Hinweise überarbeitet, s.u. ...)

HeXPloreR
12.03.2017, 06:59
HaWe scheint ja mal wieder angenervt von seinem Projekt zu sein?????

Normale Menge der Fragezeichen reicht doch auch um eine Frage zu stellen, oder?- sonst zeugt das von (ungezügelter) ungedult und hohem Streßfaktor.
Natürlich macht es einen das eine oder andere Mal verrückt wenn es nicht läuft, aber daran sieht man vielleicht auch wenn man sich übernommen hat.

Bitte einen Gang zurückschalten, oder mal anhalten und fünf Minuten durchatmen.

Habe gern geholfen ;)

Viele Grüße
Jörg

HaWe
12.03.2017, 09:06
ja, wo du Recht hast, hast du Recht, ich bin reichlich angenervt von diesen C-Libs mit ihrem ganzen Rattenschwanz von cmake u.ä., der noch hinten dranhängt und die man nicht einfach #includen kann, damit sie eben dann einfach "included" sind und fertig.
Bei Borland-C und devcpp muss ich mich um cmake u.ä. ja auch nicht kümmern, wenn ich libs #include, und wenn man openCV mit Python verwendet, muss man sich damit ja auch nicht rumschlagen.
Aber noch mal einen Gang zurück....


pkg-config --cflags opencv
-I/usr/include/opencv

pkg-config --libs opencv
/usr/lib/arm-linux-gnueabihf/libopencv_calib3d.so -lopencv_calib3d /usr/lib/arm-linux-gnueabihf/libopencv_contrib.so -lopencv_contrib /usr/lib/arm-linux-gnueabihf/libopencv_core.so -lopencv_core /usr/lib/arm-linux-gnueabihf/libopencv_features2d.so -lopencv_features2d /usr/lib/arm-linux-gnueabihf/libopencv_flann.so -lopencv_flann /usr/lib/arm-linux-gnueabihf/libopencv_gpu.so -lopencv_gpu /usr/lib/arm-linux-gnueabihf/libopencv_highgui.so -lopencv_highgui /usr/lib/arm-linux-gnueabihf/libopencv_imgproc.so -lopencv_imgproc /usr/lib/arm-linux-gnueabihf/libopencv_legacy.so -lopencv_legacy /usr/lib/arm-linux-gnueabihf/libopencv_ml.so -lopencv_ml /usr/lib/arm-linux-gnueabihf/libopencv_objdetect.so -lopencv_objdetect /usr/lib/arm-linux-gnueabihf/libopencv_ocl.so -lopencv_ocl /usr/lib/arm-linux-gnueabihf/libopencv_photo.so -lopencv_photo /usr/lib/arm-linux-gnueabihf/libopencv_stitching.so -lopencv_stitching /usr/lib/arm-linux-gnueabihf/libopencv_superres.so -lopencv_superres /usr/lib/arm-linux-gnueabihf/libopencv_ts.so -lopencv_ts /usr/lib/arm-linux-gnueabihf/libopencv_video.so -lopencv_video /usr/lib/arm-linux-gnueabihf/libopencv_videostab.so -lopencv_videostab



soll ich den ganzen Kram (obere Zeile plus der ganze untere Rest) jetzt wirklich in die Kommandozeile "Build/Erstellen" eingeben ?


oder was soll ich jetzt genau machen ?

-I/usr/include/opencv
alleine jedenfalls nutzt nichts.

Kann man den 2. Monster-Block irgendwie vorkompilieren zu einer ständigen ggf. statischen lib, die man künftig und alle kommenden opencv-Zugriffe nur nur noch komplett unverändert #includen und maximal mit mit -lxxxx und/oder -Iyyyy verlinken muss?
-lxxxx und/oder -Iyyyy lasse ich mir ja noch gefallen, aber mehr darf es wirklich nicht sein!

HaWe
13.03.2017, 09:01
weiß also keiner eine Antwort? scheint doch nicht so einfach lösbar zu sein, und das ist ja nun sogar nur das allersimpelste Beispielprogramm.
Es war ja auch genau das meine Befürchtung, opencv ist für Neulinge mit C einfach nicht machbar, im Gegensatz zu Python, da läuft es wohl alles wie am Schnürchen.
Ich denke, es läuft wohl doch auf eine Auftragsarbeit hinaus - wer fühlt sich dazu also überaupt in der Lage?


hallo
fühlt sich jemand in der Lage, C/C++ Beispielprogramme mit USB Cam und openCV samt Installationsanleitungen zu schreiben?

Die Programme sollen in der Lage sein, z.B.

Farben auf Bällen zu erkennen
https://www.youtube.com/watch?v=MWK55A0RH0U

die Farbverteilungen auf einem Rubik's Cube zu erkennen wie hier
https://www.facebook.com/groups/legomindstorms/permalink/786070768207818/

oder Formen auf Schildern zu erkennen wir hier, um daraf zu reagieren:
https://www.youtube.com/watch?v=fns19y9NOpM

alles das ist mit Python wohl recht einfach möglich, es wird aber C/C++ Code benötigt, da alle übrigen (Roboter-)Funktionen ebenfalls in C programmiert werden.
Es geht auch nur um den openCV-Image-Processing-Teil, nicht um die anschließende Reaktion der Machine/des Roboters.

(ergänzt: ) die libs und API wrapper müssen allerdings funktionieren per einfachem
#include <zzzz>
und verlinken mit simplem
make g++ plus -lxxxx und /oder -Izzzz
in einer simplen Kommandozeile, ohne makefile und ohne cmake etc. (also kompatibel zur Geany IDE mit compile/build settings)

Fühlt sich dazu jemand zunächst einmal grundsätzlich in der Lage?
Über die Umsetzung (bezahlt oder ntl gern als Freeware) kann man dann anschließend reden, und ich helfe ntl jederzeit gerne im Rahmen meiner Anfänger-Kenntnisse mit!)


und, wie gesagt, ganz wichtig:
es muss mit der Geany IDE laufen, denn damit programmiere ich auch die eigentlichen Anwendungsprogramme.

shedepe
13.03.2017, 09:53
Doch alle Informationen die du benötigst wurden dir servier fertig geliefert. Wenn du jedoch nicht bereit bist dich in die Grundlagen der C/C++ Entwicklung unter Linux einzuarbeiten und gleichzeitig, wie die meisten Anfänger meinen eine für sie optimalere Sonderlösung zu verwenden, kann man dir leider auch nicht helfen.

HaWe
13.03.2017, 12:36
Doch alle Informationen die du benötigst wurden dir servier fertig geliefert. Wenn du jedoch nicht bereit bist dich in die Grundlagen der C/C++ Entwicklung unter Linux einzuarbeiten und gleichzeitig, wie die meisten Anfänger meinen eine für sie optimalere Sonderlösung zu verwenden, kann man dir leider auch nicht helfen.

deine ersten Tipps in Ehren, aber das stimmt nicht:
es funktioniert nicht mit den von dir "servierfertigen" Parametern!

g++ -Wall -pthread -o "camtest" "camtest.c" -lwiringPi -lrt -I/usr/include/opencv (im Verzeichnis: /home/pi/programs/cam)
/tmp/ccfVGq5n.o: In function `main':
camtest.c:(.text+0x68): undefined reference to `cv::VideoCapture::VideoCapture()'
camtest.c:(.text+0x78): undefined reference to `cv::VideoCapture::open(int)'
camtest.c:(.text+0x110): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
camtest.c:(.text+0x124): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
camtest.c:(.text+0x144): undefined reference to `cv::waitKey(int)'
camtest.c:(.text+0x198): undefined reference to `cv::VideoCapture::~VideoCapture()'
camtest.c:(.text+0x1dc): undefined reference to `cv::VideoCapture::~VideoCapture()'
camtest.c:(.text+0x1f0): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
/tmp/ccfVGq5n.o: In function `cv::Mat::~Mat()':
camtest.c:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): undefined reference to `cv::fastFree(void*)'
/tmp/ccfVGq5n.o: In function `cv::Mat::release()':
camtest.c:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x58): undefined reference to `cv::Mat::deallocate()'
Kompilierung fehlgeschlagen.
collect2: error: ld returned 1 exit status


und auch
g++ -Wall -pthread -o "camtest" "camtest.c" -lwiringPi -lrt $(pkg-config --cflags --libs opencv)
ergibt sogar nur die Fehlermeldung
g++ error: unrecognized command line option "--l/usr/include/opencv"


von servierfertig kann also keine Rede sein.


Aber ich bin ja auch nicht der erste, der es nicht zum Laufen kriegt, und ich verwette mein linkes Bein, dass noch nicht einmal du es schaffst, mit den von dir selber gegebenen Infos selbst das erste simple Basisprogramm zum Laufen zu kriegen: vor allem müsstest du dir dazu auch schon die Mühe machen, es selber mit Geany auf einem Pi mit Jessie auszutesten.
Es wird aber so nicht gehen, wetten?

Aber selbst wenn man es mit ein paar (noch offenen) Zusatztricks schaffen sollte, damit ist das Problem ja noch nicht gelöst, denn jetzt fängt es ja erst an: Es geht ja eigentlich um die Farb- und Mustererkennung (wie in den youtube Videos mit Python) , die ich brauche.

Und daher meine Frage nach einer Auftragarbeit (s.o.).

Ceos
13.03.2017, 12:58
oh ich weis ich sollte es nicht schreiben, aber dennoch:

Grundlagen der C/C++ Entwicklung

dazu gehört auch ein wenig gesunder Menschenverstand und die Fähigkeit eine Fehlermeldung zu verstehen. (ich meine damit nicht die Bedeutung der Meldung an sich, sondern den Kontext und was man machen kann um es zu verstehen .. dazu gehört auch das richtige googeln)

Dein Compiler gibt dir mit der ersten Meldung ausführlich zu verstehen, dass er nicht in der Lage ist die genannten Methoden/Funktionen zu finden. Ich würde jetzt kurzerhand mit grep über die Sources von OpenCV gehen und versuchen raus zu finden wo denn die geforderten Aufrufe zu finden sind und die includes zu ergänzen.

Der 2te Fehler jedoch vermittelt mir den Eindruck, als ob sich deine Sources garnicht im richtigen Pfad befinden oder dein Geany davon ausgeht dass DU die notwendigen Resourcen in einem Projektspezifischen Ordner zur Verfügung stellst.

Dir mangelt es an Grundlagenverständnis, welches du dir wohl oder übel anlernen musst, oder du wirst ewig abhängig davon sein, dass andere deine (entschuldige den Begriff, es ist nicht bös gemeint aber beschreibt es am besten) verdrehten Einstellungen/Makefiles deiner Entwicklungsumgebung repariert.

KORREKTUR: Der 2te Fehler weist auf ein generelles Problem mit dem Makefile hin

HaWe
13.03.2017, 13:28
tja, spekulieren kann man viel - hilfreich ist es nur, wenn du es auch selber testen könntest und würdest, und zwar auf einem Pi mit einer USB cam und aktuellem Jessie samt Geany IDE.
Andernfalls ist es nicht hilfreich, eben bloße Spekulation und Raterei.
Und Hinweise auf "Menschenverstand" sind hier wirklich reichlich hochnäsig und absolut fehl am Platz. Ansonsten setze ihn doch mal selber ein, und berichte dann....! ;)

Tatsächlich compiliert es jetzt ohne errors und warnings mit den abgewandelten Parametern (die hier noch niemand erwähnt hat...!) :
g++ -o test test.cpp -lopencv_highgui -lopencv_core -lstdc++

Aber es zeigt kein Bild (LogiCam ist natürlich drin, und die läuft auch unter Windows.)

Also, immerhin ein Stück weiter, aber immer noch kein Licht am Ende des Tunnels.
Ganz zu schweigen von Farben- und Formen- und Mustererkennung.

HeXPloreR
14.03.2017, 16:01
Ich hätte aber jetzt keine Lust DEIN Projekt zu MEINEM Projekt werden zu lassen, nur weil du das gerne so hättest.

HaWe
14.03.2017, 19:32
Ich hätte aber jetzt keine Lust DEIN Projekt zu MEINEM Projekt werden zu lassen, nur weil du das gerne so hättest.

musst du ja nicht, ich hatte ja gefragt, wer es möchte und sich dazu in der Lage sieht, und nicht, wer es nicht will und/oder nicht kann.
Da du bisher aber noch nicht einmal hilfreiche Tipps für den Anfang geben konntest, denke ich, dass sich die Frage zu deiner Person bereits damit schon beantwortet hat.

HaWe
15.03.2017, 14:00
Tatsächlich compiliert es jetzt ohne errors und warnings mit den abgewandelten Parametern (die hier noch niemand erwähnt hat...!) :
g++ -o test test.cpp -lopencv_highgui -lopencv_core -lstdc++

Aber es zeigt kein Bild (LogiCam ist natürlich drin, und die läuft auch unter Windows.)
Also, immerhin ein Stück weiter, aber immer noch kein Licht am Ende des Tunnels.
Ganz zu schweigen von Farben- und Formen- und Mustererkennung.

Update:
ich habe jetzt eine neue, andere webcam probiert, und mit der bekommen ich mit den build-Parametern
g++ (gcc) -o test test.cpp -lopencv_highgui -lopencv_core (-lstdc++)
tatsächlich einen Videostream in einem kleinen extra-Window.
Hardware funktioniert also, und opencv grundsätzlich auch.

Nun könnte es losgehen mit dem Community-Projekt "opencv mit C++ und Geany", von dem sicher sehr viele profitieren würden, denn den Code werde ich natürlich zusammenfassen und verfügbar machen.

Also, wer traut sich so etwas zu und will konstruktiv mitarbeiten ?

so etwas in der Art wie hier in den Videos (mit Python) soll wie schon eingangs erwähnt als erste Ziele möglich werden:

https://www.youtube.com/watch?v=MWK55A0RH0U
https://www.youtube.com/watch?v=qcF5PFXZC3o
https://www.youtube.com/watch?v=fns19y9NOpM
https://www.youtube.com/watch?v=tpwokAPiqfs

ARetobor
16.03.2017, 04:49
Hallo HaWe,
welche Auflösung und Bildwiederholrate benötigst du?
Welcher Pi soll verwendet werden.
Warum muß es eine USB-Cam sein?
Ist es ein privates Projekt?

Ich habe mich bis vor zwei Jahren mit dem Thema
beschäftigt und habe es erst mal, zugunsten meines
Turbinen-Generator-Projekt, auf Eis gelegt.
Muß mich halt wieder rein arbeiten.
Bin aber der Meinung, dass der Pi zu schwach ist.
Für Experimente ist er aber sicherlich geeignet.

Gruß
AR

HaWe
16.03.2017, 08:53
Hallo HaWe,
welche Auflösung und Bildwiederholrate benötigst du?
Welcher Pi soll verwendet werden.
Warum muß es eine USB-Cam sein?
Ist es ein privates Projekt?
Ich habe mich bis vor zwei Jahren mit dem Thema
beschäftigt und habe es erst mal, zugunsten meines
Turbinen-Generator-Projekt, auf Eis gelegt.
Muß mich halt wieder rein arbeiten.
Bin aber der Meinung, dass der Pi zu schwach ist.
Für Experimente ist er aber sicherlich geeignet.

Gruß
AR
hallo,
zu deinen Fragen:
zu den Frames: 10-15 fps müssten ausreichen, es ist ja für die o.g. Beispiele nicht so extrem zeitkritisch, und selbst in Python funktionieren sie ja mit den Möglichkeiten, die ein Pi bietet (teilw sogar nur B+, teilw.auch 2 oder 3, siehe die Videos!). Es ist aber für mindestens einen Pi 2 (quadcore) gedacht.

USB cam, weil die PiCam von den GPIOs insb. die für i2c-0 mit belegt, es soll aber i2c-0 als zusätzlicher i2c Port verfügbar bleiben. Außerdem sind die viel billiger als die PiCam.

privates Projekt - auf jeden Fall privat, ja. Es geht um praktische Anwendungshandwerkzeuge, die man einfacher als die unglaublich komplizierten einzelnen opencv Einzelmodule ansprechen können soll. Quasi einen Haufen von zusätzlichen Wrappern, die es in C++ genauso einfach machen sollen, die opencv Funktionen zu verwenden, wie es in Python möglich ist. Es gibt zwar -zig Tutorials für opencv mit C++, aber der Code dort ist extrem monströs und unverständlich, und man braucht alleine linker flags, die so lang sind dass sie die Enzyklopedia Galactica sprengen würden. Auch hier bräuchte man eine radikale Vereinfachung, insgesamt so etwas wie ein "Arduino-Wiring" für den Pi mit g++ und opencv.

ARetobor
16.03.2017, 09:21
Hallo HaWe,
du hast die Auflösung vergessen,
640x480 macht schon 307200 Bildpunkte,
bei 24 Bit Farbauflösung also mal 3 gleich 921600.
Bei höherer Auflösung wird es dann schon für den kleinen
Pi 2 recht schwer.
Nun, privat kommen wir vielleicht zusammen, wenn nicht
zu viel Termindruck entsteht.
Wie gesagt, mein Generator-Projekt braucht noch einige Zeit.




Gruß
AR

HaWe
16.03.2017, 10:07
die Auflösung weiß ich nicht, sie soll aber auch variabel bleiben - ich habe eine Cam in dieser Art:
http://www.ebay.de/itm/381563562701?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
vermutlich werden es 640x480 sein, vlt auch 800x600, keine Ahnung, aber die Lösung soll ja auch universell für andere handelsübliche USB cams mit höherer oder niedrigerer Auflösung funktionieren. Notfalls muss der User dann eben eine langsamerere Bildverarbeitung in Kauf nehmen.

Ich habe inzwischen auch ein Tutorial über Blob Detection gefunden, eigentlich VisualC++ (weshalb ich es wschl bisher nicht gefunden habe für Pi und GCC), aber die Beispiele funktionieren offenbar mit kleinen Fehlern (waitKey funktioniert nicht) auch mit g++ : http://opencv-srf.blogspot.de/2010/09/object-detection-using-color-seperation.html
Hier funktioniert zumindest meine Cam auf Anhieb und mit leidlich erträglicher Geschwindingkeit. Die Linker flags sind allerdings der pure Horror.
Ist auch recht gut erklärt, was die Grundfunktionen angeht, könnte allerdings noch etwas handlicher sein, aber mir geht es ja zusätzlich auch um praktische Anwendungen wie die oben verlinkten, quasi samt simplifiziertem C++ Code zum Nachbauen.
Ich fange aber auf jeden Fall schon mal an und les mich in das VisualC++ Tutorial ein.

ARetobor
16.03.2017, 12:18
Hallo HaWe,
Welchen Pi verwendest du zum Testen??

Ich habe mich für mein Projekt erst mal auf 640x480x24
festgelegt.Die USB-Kamera die ich verwende macht ca 60 fps.
Allerdings ist USB 3.0 nötig, dadurch verwende ich den ODROID XU4.
Zu deiner Information:
Mein primäres Ziel ist ein Programm für den ODROID
Ich verwende von openCV nur einen Teilbereich.
Die Kamera wird mit Linux Driver (Programm) gesteuert.
Die einzelnen Bilder werden dann an openCV übergeben.
Bild Konvertierung und weitere Bildbearbeitung wird mit AssemblerProgramme
durchgeführt.
Die kleinen Programme rufen dann über SYCALL und übergeben dann
Informationen und Steuerbefehle.
Ich habe mir mal wieder die openCV.org angeschaut,
sieht sehr gekürzt aus.
Eines noch, ich arbeite nicht mit Windows.


Gruß
AR

HaWe
16.03.2017, 12:54
hallo,
ich habe nur den Pi 2 samt 1024x600 HDMI TFT, und nur für den samt Jessie brauche ich persönlich das openCV, nicht für Windows.
Odroid und Sycall kenne ich nicht und werde ich sicher auch gar nicht brauchen, denn Python braucht sie ja auch nicht für openCV, und Python ist das Maß aller Dinge, die mir für die C++ Wrapper vorschweben. Je einfacher also, desto besser. Guck dir ruhig auch mal genau die Python Codes an, die man in den 4 Videos recht gut erkennen kann und die auch einigermaßen gut erklärt werden bzw. sogar selbsterklärend sind. So soll es dann später auch in C++ aussehen.
Die Cam-Auflösung wird hier automatisch vom Programm eingestellt, so sollte es auch sein.
Grundsätzlich dient das Video-Fenster auch nur zur Orientierung für den User/Programmierer und zum Debuggen, denn eingesetzt soll openCV ja werden, um für Robotermodelle über eine Objekterkennung (Farbe, Größe, Form, Anzahl, Lokalisierung) eine Orientierungsmöglichkeit zu bieten. Hier ist für den Roboter natürlich nicht das Video selber interessant (und schon gar nicht seine Größe oder Framezahl oder Farbtiefe), sondern nur die nackten digitalen BLOB-Daten. Hiernach muss sich die Programmierung richten, um Bälle zu erkennen, Hindernissen auszuweichen, Objekte gezielt zu suchen und anzusteuern, Routen zu erkennen, usw.
Farben erkennt openCV ja wohl nativ als BGR Format (warum nicht RGB, ist mir ein Rätsel), aber sinnvoll ist sicher die Umwandlung ins HSV Format, denn Farben haben ja je nach Beleuchtung den gleichen Farbton, und nur unterschiedliche Sättigung und Luminiszenz (bei weißem Licht); das erleichtert dann die Farberkennung innerhalb gewisser Thresholds:

cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV

So macht es das openCV Tutorial, das erscheint mir sehr sinnvoll.

ARetobor
16.03.2017, 13:41
Hallo HaWe,
Python ist nicht meine Wahl. Alle Versuche die ich gemacht
habe waren langsamer als C und Assembler Programme.
Zum Verständnis:
https://de.wikipedia.org/wiki/Systemaufruf
Alle Programme Verwenden SYSCALL um Kernefunktionen
aufzurufen.
zB. Datei öffnen Datei lesen Datei schließen.
Die kleinen Assembler Dateien haben den Vorteil den Kernel direkt
anzusprechen und sind somit schön schnell!
Automatisch:
Es gibt nur Vorgaben (Parameter) die durch Programme abgearbeitet werden.
Wenn Automatisch heißt, ich habe keinen Einfluss, dann ist das immer
ein Problem!
Videos mit Programm-Code sind mir persönlich ein Gräuel.
Ich blätter lieber beim Lesen.



Gruß
AR

HaWe
16.03.2017, 15:34
da geht es mir wie dir, deshalb will ich ja auch nicht Python nutzen, sondern C(++).
Aber es war als gemeinsame Basis gedacht, wo wir starten und wo es hin gehen soll, und das ist in den Videos sehr gut zu sehen.
Schau sie dir doch bitte mal ganz genau an, falls du es nicht sowieso schon gemacht hast.

https://www.youtube.com/watch?v=MWK55A0RH0U
https://www.youtube.com/watch?v=qcF5PFXZC3o
https://www.youtube.com/watch?v=fns19y9NOpM
https://www.youtube.com/watch?v=tpwokAPiqfs

Hast du auch mal die beiden Beispielprogramme auf der Tutorial-Seite heruntergeladen und ausprobiert?
http://opencv-srf.blogspot.de/2010/09/object-detection-using-color-seperation.html
Sind auch eine sehr gute Basis, um damit zu starten.

ARetobor
16.03.2017, 17:27
Hallo HaWe,
die Beispiele habe ich mir angesehen. So ähnlich habe ich
schon mal durch probiert.
Ich sagte ja, die Seite openCV. Org hat sich sei dem ganz
schön geändert.
Schon mal hier gewesen. (Python u. C++)
https://www.learnopencv.com/

Ich bitte um Geduld, muss erst den Pi 2 und den Odroid
raus suchen und aufbauen.Die USB-Camera muss ich auch noch
finden.
Melde mich dann wieder.
Da mein alter i386 vor einem Jahr (da war alles mit drauf) das zeitliche
gesegnet hat, muss ich erst meine Sicherheitskopien sichten.
Das dauert alles ein paar Tage oder etwas mehr.

Gruß
ARetobor

PS
Mein Englisch ist nicht besonders.
Mit Google wird die Übersetzung aber schon recht ordentlich

HaWe
16.03.2017, 18:20
...
Ich sagte ja, die Seite openCV. Org hat sich sei dem ganz
schön geändert.
Schon mal hier gewesen. (Python u. C++)
https://www.learnopencv.com/

Ich bitte um Geduld, muss erst den Pi 2 und den Odroid
raus suchen und aufbauen.Die USB-Camera muss ich auch noch
finden.
Melde mich dann wieder.

stimmt - nein, das kannte ich noch nicht. Tatsächlich ist die Region Of Interest (ROI) genau das, was Shane Gingell ("Robo tech") in seinen Videos mit Python gemacht hat, sowohl um die laufenden Bälle für den Ball Color Sorter und auch was die Spuren- und Kursbestimmung bei seinem Linienfolger angeht.

ich kannte nur die alten Codes teilweise, als man das alles mit C noch haarklein selber programmieren musste. Das war echt extrem...
Sicher auch ein wesentlicher Grund, weshalb der Python Code im Vergleich so läppisch simpel aussah! Das gibt mit aber auch wieder mehr Hoffnung, mit den C++ Bordmitteln ebenfalls diese neuen Meta-Funktionen schnell und bequem aufrufen zu können.
Insgesamt habe ich jatzt tatsächlich schon viel mehr Optimismus, was die beabsichtigte Portierung solcher Apps für C++ angeht.

Aber lass dir ruhig Zeit, ich nutze sie mit zunehmendem Erfolg, um das besagte Tutorial durchzuarbeiten. Das ist wirklich gut, wenn es auch schon oft sehr an die Grenzen meiner Kenntnisse geht.


Eine Sache wäre mir allerdings als allererster Schritt sehr wichtig:
Ob es möglich ist, die ganzen Libs, die hier aufgeführt sind

-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

alle gemeinsam in 1 einzige "Über-Lib" zu vereinigen ( opencv_all.so ), die man dann nur noch per
-lopencv_all
kompilieren / builden muss?

ARetobor
16.03.2017, 20:12
Hallo HaWe,
das mit den Libs kann ich im Moment nicht beanworten.
Noch dazu gab es wie ich feststellen mußte, Unterschiede
openCV 2 und 3.
Programme die mit der 2 Version funktionierten machten in der
3 Version Probleme.
Es wird also sinnvoll sein gleich ein BS mit openCV 3.xx zu benutzen.
Das habe ich aber noch nicht weiter verfolgt.

Gruß
AR

PS
Kenntnisse erwerben kann halt mühsam sein.

HaWe
17.03.2017, 09:51
ja, sieht so aus - ich habe dazu eine Meldung von Heise gefunden:
https://www.heise.de/developer/meldung/OpenCV-3-0-mit-besserer-Performance-veroeffentlicht-2679528.html

ARetobor
18.03.2017, 10:21
Hallo,
Habe jetzt Ubuntu 16.04 Mate 64-Bit openCV3.2 installiert.
Installation ist soweit OK.
Nun Einiges geht wie erwartet nicht bzw. nicht richtig.

zB. kommt bei einem einfachen USB-Kamera Programm der Fehler:
Corrupt JPEG data -Bild ist aber auf dem Schirm.
Habe im Netz ähnliche Klagen gesehen.

Kennt Jemand von euch das Problem?

Gruß
ARetobor

PS
template Matching geht noch
ob es einen Zeitvorteil gibt, kann ich noch nicht sagen

HaWe
18.03.2017, 11:04
openCV auf Ubuntu ist hier leider nicht hilfreich, weder als Ziel noch als Mittel zum Zweck, egal ob es funktioniert oder nicht.
Ntl ist es schön, wenn du es zum Laufen bringst, aber vlt machst du dazu praktischerweise einen extra Thread auf.

Hier geht es ausschließlich um den Pi mit Raspbian Jessie samt Geany,
d.h.:
lokal compiliert in der Geany IDE auf dem Pi,
mit Tastatur+Maus+HDMI-Screen,
also weder ssh bzw. remote-Desktop noch cross-compiler,
und darauf möchte ich mich auch hier konzentrieren
- denn wenn wir uns noch um andere Linux OS und ihre Probleme kümmern müssen, kommen wir sicher gar nicht zum Ziel.

ARetobor
18.03.2017, 20:17
Hallo HaWe,
leider habe ich dann wohl etwas falsch verstanden.
Wie gesagt mein primäres Ziel ist nicht der Pi.
Wenn sich meine Arbeit mit dem Pi verbinden lässt werde
ich mich melden.
Ab und zu schau ich auch so rein.

Gruß
AR