Exemplo n.º 1
0
int main ( int argc,char **argv ) 
{
	openAndInitSpi();
	time_t timer_begin,timer_end;
    RaspiCam_Cv Camera;
    Mat image;
    int nCount=100;
    //set camera params
    Camera.set( CV_CAP_PROP_FORMAT      , CV_8UC1     );
    Camera.set( CV_CAP_PROP_FRAME_WIDTH , frame_width );
    Camera.set( CV_CAP_PROP_FRAME_HEIGHT, frame_height);
    //Open camera
    cout<<"Opening Camera..."<<endl;
    if (!Camera.open()) {cerr<<"Error opening the camera"<<endl;return -1;}
    //Start capture
    cout<<"Capturing "<<nCount<<" frames ...."<<endl;
    time ( &timer_begin );
    for ( int image_counter=0; image_counter<nCount; image_counter++ ) 
    {
		Camera.grab();
        Camera.retrieve ( image );
        //threshold(image,image,low_threshold,high_threshold,cv::THRESH_BINARY);
        //if(image_counter==50)
        //{
			cout << "Log: beléptem a " << image_counter << ". képbe" << endl;
			vector<Point> points;
			image_processing(image,points);
			cout << "A " << image_counter << ". képen a vonal helye: " << vector_average(points,2)  << endl;
		//}
	}
    Camera.grab();
    Camera.retrieve(image);
    time ( &timer_end );
    Camera.release();
    cout<<"Stop camera..."<<endl;
    
    //show time statistics
    double secondsElapsed = difftime ( timer_end,timer_begin );
    cout<< secondsElapsed<<" seconds for "<< nCount<<"  frames : FPS = "<<  ( float ) ( ( float ) ( nCount ) /secondsElapsed ) <<endl;
    
    /**
     *Képek itt kerülnek mentésre:
     * 	1.: az eredeti kép (grayscale)
     * 	2.: a küszöbözött kép - egyenlőre nincs felhasználva ez a függvény, hiszen
     * 		még nincs rá szükség
     * 	3.:	az eredet kép immáron színesben: rajta a vonal két szélének (piros) és a 
     * 		középének (zöld) a becslőjével
     */
    imwrite("raspicam_cv_image_original.jpg",image);
    Mat colourful_image = image.clone();
    cvtColor(colourful_image,colourful_image,CV_GRAY2BGR);
    
    
    vector<Point> points;
    image_processing(image,points);
    int sum_left    = vector_average(points,1);
    int sum_average = vector_average(points,2);
    int sum_right   = vector_average(points,3);
	cout<<"Average:   "<< sum_average << endl;
	cout<<"Sum_left:  "<< sum_left    << endl;
	cout<<"Sum_right: "<< sum_right   << endl;
    line(colourful_image,Point(sum_left   ,1), Point(sum_left   ,frame_height),Scalar(0,0,255),2);
    line(colourful_image,Point(sum_right  ,1), Point(sum_right  ,frame_height),Scalar(0,0,255),2);
    line(colourful_image,Point(sum_average,1), Point(sum_average,frame_height),Scalar(0,255,0),2);
    threshold(image,image,low_threshold,high_threshold,cv::THRESH_BINARY);
    imwrite("raspicam_cv_image_threshold.jpg",image);
    imwrite("raspicam_cv_image_colourful.jpg",colourful_image);
    closeSpi();
}
Exemplo n.º 2
0
void Robot::trackLine() {
	RaspiCam_Cv camera;

	if (camera.open()) {
		Mat captured;
		vector<vector<Point> > contours;
		vector<Vec4i> hierarchy;

		while (1) {
			camera.grab();
			camera.retrieve(captured);

			Point capturedImageCenter(captured.cols / 2, captured.rows / 2);
			circle(captured, capturedImageCenter, 5, Scalar(0, 255, 0), -1, 8,
					0);

			// region of interest. currently around the center of the
			// captured image. might need to be moved depending on the
			// camera angle, speed of the robot etc.
			Rect roi(0, capturedImageCenter.y - 45, captured.cols, 100);
			Mat roiImg = captured(roi).clone();

			// extract the line to follow from the background
			cvtColor(roiImg, roiImg, COLOR_BGR2GRAY);
			threshold(roiImg, roiImg, lineTrackingThreshold, MAX_BINARY_VALUE, 1);

			// displaying this is useful to see if the threshold is OK
			if (!headless) {
				imshow(THRESHOLD_WINDOW_NAME, roiImg);
				waitKey(30);
			}

			Mat erodeElmt = getStructuringElement(MORPH_RECT, Size(3, 3));
			Mat dilateElmt = getStructuringElement(MORPH_RECT, Size(5, 5));
			erode(roiImg, roiImg, erodeElmt);
			dilate(roiImg, roiImg, dilateElmt);

			// determine the angle the robot needs to move
			findContours(roiImg, contours, hierarchy, CV_RETR_TREE,
					CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

			if (contours.size() == 0) {
				cout << "no tracking line detected." << endl;
				pushMotor->stop();
//				return;
			}

			for (size_t i = 0; i < contours.size(); i++) {
				float area = contourArea(contours[i]);
				if (area > 2000) {
					Moments mu;
					mu = moments(contours[i], false);
					Point2f roiCenter(mu.m10 / mu.m00,
							capturedImageCenter.y - LOOK_AHEAD); // point in center (x only)
					circle(captured, roiCenter, 5, Scalar(0, 255, 0), -1, 8, 0);
					line(captured, capturedImageCenter, roiCenter,
							Scalar(0, 255, 0));

					float ankathete = LOOK_AHEAD;
					float gegenkathete = capturedImageCenter.x - roiCenter.x;
					float bogenmass = atan(gegenkathete / ankathete);
					float gradmass = bogenmass * 180 / 3.1415926535;

					string caption = format("%f Grad", gradmass);
					putText(captured, caption,
							Point(capturedImageCenter.x + 20,
									capturedImageCenter.y + 20),
							FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0));

					if (!pushMotor->isStarted()) {
						pushMotor->startCounterClockwise();
					}
					steer(gradmass);
				}
			}

			if (!headless) {
				imshow(MAIN_WINDOW_NAME, captured);
				imshow(ROI_WINDOW_NAME, roiImg);
				waitKey(30);
			}
		}
	} else {
		cout << "failed to open camera." << endl;
		exit(EXIT_FAILURE);
	}
}