Example #1
0
vector<Point> preprocess_points(vector<Point>& vec)
{
    Point pivot = vec[vec.size() - 1];
    Point pt_y_max = get_y_max_point(vec);

    int x_diff = WIDTH_SMALL / 2 - pivot.x;
    int y_diff = HEIGHT_SMALL / 2 - pt_y_max.y;

    vector<Point> vec_adjusted;
    for (Point& pt : vec)
        vec_adjusted.push_back(Point(pt.x + x_diff, pt.y + y_diff));

    return vec_adjusted;
}
void compute_stereo_permutation(MonoProcessorNew& mono_processor0, MonoProcessorNew& mono_processor1,
								PointResolver& point_resolver, PointerMapper& pointer_mapper, Mat& image0, Mat& image1)
{
	MonoData mono_data_large;
	MonoData mono_data_small;
	MonoData mono_data0;
	MonoData mono_data1;
	bool side_flipped;
	if (mono_processor0.fingertip_points.size() > mono_processor1.fingertip_points.size())
	{
		mono_data_large = MonoData(&mono_processor0.fingertip_points, &mono_processor0, image0, 0);
		mono_data_small = MonoData(&mono_processor1.fingertip_points, &mono_processor1, image1, 1);
		mono_data0 = mono_data_large;
		mono_data1 = mono_data_small;
		side_flipped = false;
	}
	else
	{
		mono_data_small = MonoData(&mono_processor0.fingertip_points, &mono_processor0, image0, 0);
		mono_data_large = MonoData(&mono_processor1.fingertip_points, &mono_processor1, image1, 1);
		mono_data1 = mono_data_large;
		mono_data0 = mono_data_small;
		side_flipped = true;
	}

	const int large_array_size = mono_data_large.array->size() > 5 ? 5 : mono_data_large.array->size();
	const int small_array_size = mono_data_small.array->size() > 5 ? 5 : mono_data_small.array->size();

	compute_permutations(large_array_size, small_array_size);

	float dist_sigma_min = 9999;
	StereoPair stereo_pair_dist_sigma_min;

	Point pt_y_max_large = get_y_max_point(*mono_data_large.array);
	Point pt_y_max_small = get_y_max_point(*mono_data_small.array);
	int alignment_y_diff = pt_y_max_large.y - pt_y_max_small.y;
	int alignment_x_diff = mono_data_large.mono_processor->pt_alignment.x - mono_data_small.mono_processor->pt_alignment.x;

	for (vector<int>& rows : permutations)
	{
		float dist_sigma = 0;
		StereoPair stereo_pair;

		int small_array_index = 0;
		for (int large_array_index : rows)
		{
			stereo_pair.push_large_index(large_array_index);
			stereo_pair.push_small_index(small_array_index);

			Point pt_small_array = (*mono_data_small.array)[small_array_index];
			Point pt_large_array = (*mono_data_large.array)[large_array_index];

			pt_small_array.x += alignment_x_diff;
			pt_small_array.y += alignment_y_diff;

			float dist = get_distance(pt_small_array, pt_large_array, false);
			dist_sigma += dist;

			++small_array_index;
		}
		if (dist_sigma < dist_sigma_min)
		{
			dist_sigma_min = dist_sigma;
			stereo_pair_dist_sigma_min = stereo_pair;
		}
	}

	stereo_pair_dist_sigma_min.compute(mono_data_large.array,                           mono_data_small.array,
									   mono_data_large.mono_processor->fingertip_blobs, mono_data_small.mono_processor->fingertip_blobs,
									   mono_data0,                                      mono_data1,
									   side_flipped);

	Mat image_visualization = Mat::zeros(HEIGHT_LARGE, WIDTH_LARGE, CV_8UC1);

	Point pt_resolved_pivot0 = point_resolver.reprojector->remap_point(mono_data0.mono_processor->pt_palm, mono_data0.side, 4);
	Point pt_resolved_pivot1 = point_resolver.reprojector->remap_point(mono_data1.mono_processor->pt_palm, mono_data1.side, 4);

	static const int frame_cache_num = 3;
	static int cached_count = -1;
	static bool begin_action = false;

	++cached_count;
	if (cached_count == frame_cache_num)
	{
		cached_count = 0;
		begin_action = true;
	}

	static StereoPair stereo_pair_vec[frame_cache_num];
	stereo_pair_vec[cached_count] = stereo_pair_dist_sigma_min;

	if (!begin_action)
		return;

	int index_before = cached_count - (frame_cache_num - 1);
	if (index_before < 0)
		index_before = frame_cache_num + index_before;

	StereoPair stereo_pair_current = stereo_pair_vec[index_before];

	for (int i = 0; i < stereo_pair_current.pt_vec_large_sorted.size(); ++i)
	{
		BlobNew* blob_large = &stereo_pair_current.blob_vec_large_sorted[i];
		BlobNew* blob_small = &stereo_pair_current.blob_vec_small_sorted[i];
		BlobNew* blob0 = stereo_pair_current.side_flipped ? blob_small : blob_large;
		BlobNew* blob1 = stereo_pair_current.side_flipped ? blob_large : blob_small;

		Point2f pt_resolved0 = point_resolver.compute(blob0->pt_tip,
							       stereo_pair_current.mono_data0.image, stereo_pair_current.mono_data0.side);
		Point2f pt_resolved1 = point_resolver.compute(blob1->pt_tip,
								   stereo_pair_current.mono_data1.image, stereo_pair_current.mono_data1.side);

#if 0
		circle(image_visualization, pt_resolved0, 5, Scalar(127), 2);
		circle(image_visualization, pt_resolved1, 5, Scalar(254), 2);
		circle(image_visualization, pt_resolved_pivot0, 10, Scalar(127), 2);
		circle(image_visualization, pt_resolved_pivot1, 10, Scalar(254), 2);
#endif

#if 1
		if (pt_resolved0.x != 9999 && pt_resolved1.x != 9999)
		{
			Point3f pt3d = point_resolver.reprojector->reproject_to_3d(pt_resolved0.x, pt_resolved0.y,
																	   pt_resolved1.x, pt_resolved1.y);
			
			circle(image_visualization, Point(320 + pt3d.x, 240 + pt3d.y), pow(1000 / pt3d.z, 2), Scalar(127), 1);
		}
#endif
	}
	imshow("image_visualizationiuhuewli", image_visualization);
}