// Listing 10.1. Sumowanie trzech kanałów obrazu za pomocą funkcji cv::threshold()

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;

void sum_rgb( const cv::Mat& src, cv::Mat& dst ) {

	// dzieli obraz na płaszczyzny kolorów
	//
	vector< cv::Mat> planes;
	cv::split(src, planes);
	cv::Mat b = planes[0], g = planes[1], r = planes[2], s;

	// dodaje jednakowo ważone wartości rgb
	//
	cv::addWeighted( r, 1./3., g, 1./3., 0.0, s );
	cv::addWeighted( s, 1., b, 1./3., 0.0, s );

	// obcina wartości powyżej 100
	//
	cv::threshold( s, dst, 100, 100, cv::THRESH_TRUNC );
}

void help(char ** argv) {
	cout << "\nListing 10.1. Sumowanie trzech kanałów obrazu za pomocą funkcji cv::threshold().\n" << endl;
	cout << "Wywołanie:\n" << argv[0] << " ../faces.jpg" << endl;
}

int main(int argc, char** argv) {
	help(argv);
	if(argc < 2) { cout << "\nOkreśl obraz wejściowy" << endl; return -1; }

	// ładuje obraz z określonego pliku
	//
	cv::Mat src = cv::imread( argv[1] ), dst;
	if( src.empty() ) { cout << "Nie udało się załadować obrazu " << argv[1] << endl; return -1; }
	sum_rgb( src, dst);

	// tworzy okno o takiej samej nazwie jak nazwa pliku i wyświetla w nim obraz
	//
	cv::imshow( argv[1], dst );

	// czeka bezczynnie, aż użytkownik naciśnie jakikolwiek klawisz
	//
	cv::waitKey(0);
	return 0;
}
