Exemplo n.º 1
0
        }//求平面交点,输入交点的顺利有讲究(前两个点是是第一副图的轮廓点,后两个是极线上的点)

        List <double[]> Compute_epiline_contour_intersection(CvMat right_epiline_point, double[,] ref_img_contour, int n)//n表示划分bin的个数
        {
            //计时
            //Stopwatch sw = new Stopwatch();
            //sw.Start();

            double[] epipole = new double[2];

            //计算极点
            double X1 = right_epiline_point[2, 0];
            double Y1 = right_epiline_point[1, 0];
            double X2 = right_epiline_point[2, 1];
            double Y2 = right_epiline_point[1, 1];

            epipole[0] = (Y2 - Y1) / (Y2 / X2 - Y1 / X1);
            epipole[1] = (X2 - X1) / (X2 / Y2 - X1 / Y1);
            double temp;
            double radius;
            double x, y;
            double min_radius = 200.0;
            double max_radius = -200.0;

            //double min_radius_contour_point;
            //double max_radius_contour_point;
            double[] temp_radius = new double[ref_img_contour.GetLength(1)];

            for (int i = 0; i < ref_img_contour.GetLength(1); i++)//不用最后一个轮廓点
            {
                //求角度 tan -> 角度,将其分到一个盒子中,一共有n=360/m个盒子
                x = ref_img_contour[0, i] - epipole[0];
                y = ref_img_contour[1, i] - epipole[1];

                //cacu_angle
                temp_radius[i] = Math.Atan2(y, x) + Math.PI;//x轴负方向为0,2pi,x轴正方向为pi

                if (temp_radius[i] < min_radius)
                {
                    min_radius = temp_radius[i];
                    //min_radius_contour_point = i;
                }
                else if (temp_radius[i] > max_radius)
                {
                    max_radius = temp_radius[i];
                    //max_radius_contour_point = i;
                }
            }



            List <int>[] bins = new List <int> [n + 1];
            for (int i = 0; i < bins.GetLength(0); i++)
            {
                bins[i] = new List <int>();
            }



            for (int i = 0; i < ref_img_contour.GetLength(1); i++)//不用最后一个轮廓点
            {
                //put_in_bins
                temp = (temp_radius[i] - min_radius) / ((max_radius - min_radius) / n);
                bins[(int)((temp_radius[i] - min_radius) / ((max_radius - min_radius) / n))].Add(i);//将第i个点放入盒子中
            }


            IplImage img = Cv.CreateImage(new CvSize(2000, 1500), BitDepth.U8, 3);

            Cv.Set(img, new CvScalar(255, 255, 255));
            for (int i = 0; i < bins.Length; i++)
            {
                Random rand = new Random();
                int    r    = rand.Next() % 255;
                int    g    = rand.Next() % 255;
                int    b    = rand.Next() % 255;
                if (i == 0)
                {
                    r = 255; g = 0; b = 0;
                }
                else if (i == 1)
                {
                    r = 0; g = 255; b = 0;
                }
                else if (i == 2)
                {
                    r = 0; g = 0; b = 255;
                }
                else if (i == 3)
                {
                    r = 0; g = 255; b = 255;
                }
                else if (i == 4)
                {
                    r = 255; g = 0; b = 255;
                }
                else if (i == 5)
                {
                    r = 255; g = 255; b = 0;
                }

                for (int j = 0; j < bins[i].Count; j++)
                {
                    int k = bins[i][j];

                    img.DrawLine(new CvPoint((int)ref_img_contour[0, k], (int)ref_img_contour[1, k]),
                                 new CvPoint((int)(ref_img_contour[0, k] + 1), (int)(ref_img_contour[1, k]) + 1), Cv.RGB(r, g, b), 2);
                }
            }

            Cv.SaveImage("bins.jpg", img);

            ////将最后一个点和第一个点连起来
            //y = ref_img_contour[0, 1] - ref_img_contour[0, ref_img_contour_num-1];
            //x = ref_img_contour[0, 0] - ref_img_contour[0, ref_img_contour_num-2];
            //radius = Math.Atan2(y, x)+Math.PI;
            //bins[(int)(radius / (2*Math.PI / n))].Add(ref_img_contour_num/2-1);//将第i个点放入盒子中

            double[]        intersection_point;
            List <double[]> intersection_point_list = new List <double[]>();

            CvPoint epiline_point_start;
            CvPoint epiline_end_point_end;
            CvPoint contour_line_point_start;
            CvPoint contour_line_point_end;

            //计算极线所在的bin
            int current_bin;

            for (int i = 0; i < right_epiline_point.GetDimSize(1); i++)
            {
                y = right_epiline_point[1, i] - right_epiline_point[3, i];
                x = right_epiline_point[0, i] - right_epiline_point[2, i];

                radius = Math.Atan2(y, x) + Math.PI;
                if (radius >= min_radius && radius <= max_radius)
                {
                    current_bin = (int)((radius - min_radius) / ((max_radius - min_radius) / n));

                    for (int j = 0; j < bins[current_bin].Count - 1; j++)
                    {
                        epiline_point_start.X      = (int)(right_epiline_point[0, i]);
                        epiline_point_start.Y      = (int)(right_epiline_point[1, i]);
                        epiline_end_point_end.X    = (int)(right_epiline_point[2, i]);
                        epiline_end_point_end.Y    = (int)(right_epiline_point[3, i]);
                        contour_line_point_start.X = (int)(ref_img_contour[0, bins[current_bin][j]]);
                        contour_line_point_start.Y = (int)(ref_img_contour[1, bins[current_bin][j]]);
                        contour_line_point_end.X   = (int)(ref_img_contour[0, bins[current_bin][j] + 1]);
                        contour_line_point_end.Y   = (int)(ref_img_contour[1, bins[current_bin][j] + 1]);

                        intersection_point = SL_Cross_Intersection(contour_line_point_start, contour_line_point_end, epiline_point_start, epiline_end_point_end);

                        if (intersection_point[0] > 0.0)
                        {
                            intersection_point[0] = i;
                            intersection_point_list.Add(intersection_point);
                        }
                    }
                }
            }

            ////显示计时时间
            //sw.Stop();
            //MessageBox.Show(sw.ElapsedMilliseconds.ToString());

            return(intersection_point_list);
        }