用鼠标点击获得图片的角点

/*----------------------------------------------------------------
 *    函数功能:获得图片的角点并存放在image_point中
 *    输入:        CvSize board_size            ---    标定的图片区域大小
 *                int number_of_board            --- 要标定的图片数目
 *                string distorted_base_path    --- 畸变图片的路径
 *                string undistorted_base_path--- 非畸变图片的路径
 *                CvMat*& object_points        --- 存储世界坐标系的点
 *                CvMat*& image_points        --- 存储图片坐标系的点
 *                CvMat*&    point_counts        --- 每幅图的角点个数
 *                int image_start_base        --- 图片的基址
 ------------------------------------------------------------------*/
void GetCorners(CvSize board_size,                    //要标定的区域大小
                int number_of_board,                //总共要标定的图片
                string distorted_base_path,            //畸变图片的路径
                string undistorted_base_path,        //非畸变图片的路径
                CvMat*& object_points,                //存储世界坐标系的点
                CvMat*& image_points,                //存储图片坐标系的点
                CvMat*& point_counts,
                int image_start_base = 1
               );
{
    int board_w = board_size.width;
    int board_h = board_size.height;
    int board_n = board_w * board_h;

    int successes = 0;
    int i,j;
    char image_name[255];
    char window_name[255] = "front";
    int image_name_temp = image_start_base;

    sprintf_s(image_name, "%d", image_name_temp);
    sprintf_s(window_name, "%d", image_name_temp);
    IplImage* src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1);
    
    cvNamedWindow(window_name);
mouse_callback:
     cvSetMouseCallback(window_name, MyMouseCallback, (void*)src_img);

    cvNamedWindow(window_name);
    //if we get the number of corners is enough ,add it to our data 
    while ((successes + image_start_base - 1)< number_of_board)
    {
        while (true)
        {
            cvShowImage(window_name,src_img);
            if(cvWaitKey(15)==27)
            {
                cout << "=================================================\n";
                cout << "mouse_click_count: " << mouse_click_cnt << endl;
                cout << "=================================================" << endl;
                // Get Subpixel accuracy on those corners

                //Draw it on the image
                cvDrawChessboardCorners(src_img, board_size, corner_get_by_mouse, (mouse_click_cnt-1), 1);
                cvShowImage(window_name, src_img);
            //    cvSaveImage("E:\\1_corner.bmp", src_img);
                cvWaitKey(0);
                cvDestroyWindow(window_name);
                break;
            }
        }

        if ( mouse_click_cnt == board_n )
        {
            int step = successes * board_n;
            for (i = step, j = 0; j < board_n; ++i, ++j)
            {
                CV_MAT_ELEM(*image_points, float, i, 0) = corner_get_by_mouse[j].x;
                CV_MAT_ELEM(*image_points, float, i, 1) = corner_get_by_mouse[j].y;
                
                CV_MAT_ELEM(*object_points, float, i, 0) = j % board_w;            //x
                CV_MAT_ELEM(*object_points, float, i, 1) = j / board_w;            //y
                CV_MAT_ELEM(*object_points, float, i, 2) = 0.0f;                //z
            }
            CV_MAT_ELEM(*point_counts, int, successes, 0) = board_n;
                
            successes ++;
            mouse_click_cnt = 0;    
            //load another picture
            if (successes < number_of_board)
            {
                image_name_temp ++;
                sprintf_s(image_name, "%d", image_name_temp);
                sprintf_s(window_name, "%d", image_name_temp);
                src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1);
                cvNamedWindow(window_name);
            }
        }
        //标定的点有错,重新标定该幅图片

        if (mouse_click_cnt != board_n)
        {
            mouse_click_cnt = 0;
            sprintf_s(image_name, "%d", image_name_temp);
            sprintf_s(window_name, "%d", image_name_temp);
            src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1);
            cvNamedWindow(window_name);
        }
        goto mouse_callback;
    }

    cvReleaseImage(&src_img);
    cvDestroyWindow(window_name);
}

 

转载于:https://www.cnblogs.com/chenzongxiong/p/3575855.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值