void test_single_dest() { // push only tbb::flow::graph g; tbb::flow::source_node<T> src(g, source_body<T>() ); test_push_receiver<T> dest; tbb::flow::make_edge( src, dest ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { ASSERT( dest.get_count(i) == 1, NULL ); } // push only tbb::atomic<int> counters3[N]; tbb::flow::source_node<T> src3(g, source_body<T>() ); function_body<T> b3( counters3 ); tbb::flow::function_node<T,bool> dest3(g, tbb::flow::unlimited, b3 ); tbb::flow::make_edge( src3, dest3 ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { int v = counters3[i]; ASSERT( v == 1, NULL ); } // push & pull tbb::flow::source_node<T> src2(g, source_body<T>() ); tbb::atomic<int> counters2[N]; function_body<T> b2( counters2 ); tbb::flow::function_node<T,bool> dest2(g, tbb::flow::serial, b2 ); tbb::flow::make_edge( src2, dest2 ); #if TBB_PREVIEW_FLOW_GRAPH_FEATURES ASSERT(src2.successor_count() == 1, NULL); typename tbb::flow::source_node<T>::successor_vector_type my_succs; src2.copy_successors(my_succs); ASSERT(my_succs.size() == 1, NULL); #endif g.wait_for_all(); for (int i = 0; i < N; ++i ) { int v = counters2[i]; ASSERT( v == 1, NULL ); } // test copy constructor tbb::flow::source_node<T> src_copy(src); test_push_receiver<T> dest_c; ASSERT( src_copy.register_successor(dest_c), NULL ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { ASSERT( dest_c.get_count(i) == 1, NULL ); } }
void test_single_dest() { // push only tbb::flow::graph g; tbb::flow::source_node<T> src(g, source_body<T>() ); test_push_receiver<T> dest; tbb::flow::make_edge( src, dest ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { ASSERT( dest.get_count(i) == 1, NULL ); } // push only tbb::atomic<int> counters3[N]; tbb::flow::source_node<T> src3(g, source_body<T>() ); function_body<T> b3( counters3 ); tbb::flow::function_node<T,bool> dest3(g, tbb::flow::unlimited, b3 ); tbb::flow::make_edge( src3, dest3 ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { int v = counters3[i]; ASSERT( v == 1, NULL ); } // push & pull tbb::flow::source_node<T> src2(g, source_body<T>() ); tbb::atomic<int> counters2[N]; function_body<T> b2( counters2 ); tbb::flow::function_node<T,bool> dest2(g, tbb::flow::serial, b2 ); tbb::flow::make_edge( src2, dest2 ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { int v = counters2[i]; ASSERT( v == 1, NULL ); } // test copy constructor tbb::flow::source_node<T> src_copy(src); test_push_receiver<T> dest_c; ASSERT( src_copy.register_successor(dest_c), NULL ); g.wait_for_all(); for (int i = 0; i < N; ++i ) { ASSERT( dest_c.get_count(i) == 1, NULL ); } }
int main(int argc, const char** argv) { cv::CommandLineParser parser(argc, argv, keys); std::string infile = parser.get<std::string>("input"); std::string outdir = parser.get<std::string>("outdir"); std::string cascade_file = "haarcascade_frontalface_alt.xml"; cv::CascadeClassifier cascade; if (cascade_file.empty() || !cascade.load(cascade_file)) { std::cout << cv::format("Error: cannot load cascade file!\n"); return -1; } cv::Mat src = cv::imread(infile); if (src.empty()) { std::cout << cv::format("Error: cannot load source image!\n"); return -1; } cv::Mat gray; cv::cvtColor(src, gray, CV_BGR2GRAY); cv::equalizeHist(gray, gray); std::vector<cv::Rect> faces; cascade.detectMultiScale(gray, faces, 1.2, 3); std::cout << cv::format("0, %s (%dx%d)\n", infile.c_str(), src.cols, src.rows); cv::Mat src_copy = src.clone(); for (int i = 0; i < faces.size(); i++) { std::string outfile(cv::format("%s/face-%d.jpg", outdir.c_str(), i+1)); cv::Rect r = faces[i]; cv::rectangle(src, r, CV_RGB(0,255,0), 2); cv::imwrite(outfile, src_copy(r)); cv::imwrite(infile, src); std::cout << cv::format("%d, %s (%dx%d)\n", i+1, outfile.c_str(), r.width, r.height); } return 0; }