Hey.
1. Kamera einlesen:
(Auch nur von hier geklaut: http://answers.opencv.org/question/1...rom-my-webcam/)
Code:
#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/tutor...gh_circle.html
Um den Circle rauszuschneiden: http://answers.opencv.org/question/1...-hough-circle/
Treshold kann man die inRange Funktion verwenden: (Auch geklaut von stackoverflow : https://stackoverflow.com/questions/...mage-in-opencv)
Code:
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/tutor...ugh_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.
Code:
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++
Lesezeichen