Witam. Jestem początkujący w OpenCV. Na chwilę obecną zadaniem programu jest "tylko" odtworzenie filmu i wykrycie oraz śledzenie aut. Pojawił się pierwszy problem pod względem optymalizacji i płynności działania.
Po wczytaniu filmu i odpaleniu go przez OpenCV wszystko działało płynnie (film nie klatkował). Następnie po zastosowaniu kaskady Haara (pobranej z Internetu) do wykrywania aut, nagle spadła płynność wyświetlania filmu. Owszem kaskada działa, auta są wykrywane, ale film strasznie klatkuje i pojawiają się tzw lagi.. Postanowiłem nałożyć na film maskę bitwą po to aby kaskada nie analizowała całego materiału wideo, lecz na razie tylko połowę. Spodziewałem się, że po takim zabiegu płynność filmu wzrośnie. Niestety płynności odtwarzania nadal nie ma właściwie mam wrażenie, że jeszcze się pogorszyła.
Na chwilę obecną pobieram każdą klatkę filmu. Czy jeśli będę pobierał do kaskady np. co 3 klatę to jest szansa, że płynność wzrośnie? Pomocy.



#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include<vector>
#include "opencv2/highgui/highgui.hpp"
#include<iostream>

#define VIDEO_FILE_PATH "video.avi"
#define CASCADE_FILE_PATH "cars3.xml"
#define PICTURE_FILE_PATH "picture.jpg"
#define WINDOW_NAME " Red lajn detektor "

using namespace cv;
using namespace std;
Rect selection;
vector<vector<int>>position_points;
int counter = 0;
Point set_point;
void tracking(Mat & img, const vector< Rect > & locations, const Scalar & color)
{
	if (!locations.empty())
	{
		vector< Rect >::const_iterator loc = locations.begin();
		vector< Rect >::const_iterator end = locations.end();
		for (; loc != end; ++loc)
		{
			rectangle(img, *loc, color, 2);
		}
	}
}

void mouse_click(int event, int Xpos, int Ypos, int flags, void* userdata)
{

	if (flags == (EVENT_FLAG_LBUTTON))
	{
		cout << Xpos << "	" << Ypos << endl;
		Scalar(0, 255, 255);
		set_point.x = Xpos;
		set_point.y = Ypos;

		position_points.push_back(vector<int>());
		position_points[counter].push_back(Xpos);
		position_points[counter].push_back(Ypos);
		counter++;
		if (counter == 5)
		{
			counter = 0;
			position_points.clear();
			system("cls");
			cout << "---> przekroczona maksymalna liczba klikniec (4), pozycje x,y wyzerowane <-- " << endl;
		}
	}

}


int main()
{
	VideoCapture capture(VIDEO_FILE_PATH, CV_LOAD_IMAGE_GRAYSCALE);
	Mat frame, mGray;
	CascadeClassifier classifier;
	vector<Rect> vFound;
	
	

	if (!capture.isOpened())
		throw "Błąd otwierania pliku";
	
	classifier.load(CASCADE_FILE_PATH);
	capture.open(VIDEO_FILE_PATH);
	namedWindow(WINDOW_NAME, 1);
	cout << "x pos" << "	" << "y pos" << endl;
	setMouseCallback(WINDOW_NAME, mouse_click, NULL);

	//capture.set(CAP_PROP_FPS, 100);
	for(; ;)
	{
		// Apply the classifier to the frame
		capture >> frame;
		Mat mask = Mat::zeros(frame.size(), frame.type());
		Mat wynikowa = Mat::zeros(frame.size(), frame.type());
		circle(mask, cv::Point(mask.rows / 2, mask.cols / 2), 400, Scalar(255, 0, 0), -1, 8, 0);
		
		frame.copyTo(wynikowa, mask);
		if (wynikowa.empty())
			break;
		cvtColor(wynikowa, mGray, COLOR_BGR2GRAY);
		equalizeHist(mGray, mGray);
		classifier.detectMultiScale(mGray, vFound, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

		tracking(wynikowa, vFound, Scalar(10, 255, 0));
		imshow(WINDOW_NAME, wynikowa);

		waitKey(2);

		if ((char)cv::waitKey(1) == 27)
		{
			void destroyAllWindows();
			exit(1);
			cout << "test" << endl;
		}
		if ((char)cv::waitKey(1) == 32)
		{
			
			cout << "--------" << endl;
			if ((!position_points.empty()) && (position_points.size()>3))
			{
				cout << position_points[0][0] << "	" << position_points[0][1] << endl;
				cout << position_points[1][0] << "	" << position_points[1][1] << endl;
				cout << position_points[2][0] << "	" << position_points[2][1] << endl;
				cout << position_points[3][0] << "	" << position_points[3][1] << endl;
			}
			
  			system("cls");
			position_points.clear();
			cout << "--> Zaznaczanie anulowane, pozycje x i y wyzerowane !" << endl;
			counter = 0;

		}

	}

	return 0;
}