原创 摄像机标定的笔记(个人使用很乱)

2009-2-28 04:26 8208 9 9 分类: 软件与OS

没有解决的问题:
1.bmp文件读取后怎么得到几个结构的数据,就是内存的copy问题
2.bmp文件转换为IPLimage文件,似乎涉及到内存对齐的问题
3.窗口的分割与停靠问题,在分割窗口中显示文件列表以及打开文件的操作
4.把程序设置的参数保存到磁盘中,程序在打开的使用自动载入数据,似乎和文档类的序列化有关


1.    这个程序是摄像机的驱动框架,后面的代码可以在此基础上加入,不过框架还有待改进的地方,尤其是涉及到多个相机的操作的时候,还没有把这个问题考虑进去
2.    单个相机标定的框架以及实现的功能
(1)    利用相机得到图片,自动完成程序的标定工作
(2)    手动从其他地方载入图片,进行标定
3.(1)从相机得到的是图像的数据,由此可以保存为bmp图像的格式,也可以转换为IPImage的格式   
(2)从硬盘中得到的bmp数据,则需要做bmp到IPImage的转换
对于(1)
可以在对话框的设置后,设置一个标志来说明要做标定,当单帧采集数据的时候根据这个标记将图像以bmp的格式、
保存,并且保存转换为IpiIMAGE格式(或者直接提取出坐标,角点数据,这样可以节约内存,如果在其他地方做这些
事情的话,还要开辟很大的空间去存储这些图片数据),可以考虑采集到的数据文件显示在分割窗口中,得到的数据也显示
在对应的窗口中
*************************************************************
实际上没有做第二种情况,虽然能做,但是只是是系统复杂,而没有实际太大的作用
*************************************************************
对于第二种情况,可能需要连续选中很多文件,
/////////////////////////////////
现在面临的难题是:
(1)界面的操作,需要分割界面,以及不同视图见的数据传输
//*********************************************************
虽然可以做,但是时间会不够,没做那么复杂的界面
//***********************************************************
(2)文件的载入中需要做图片间的转换以及连续载入图片的问题
/////////////////////////////////
解决的问题路径
1.图片格式的转换
2.图片载入的问题
3.标定程序
4.摄像机采集图片以及标定
5.界面问题
////////////////////////////////
可以使用cvloadimage来载入图片的话,对于标定来说还是比较可行的 直接在OPENdovument中载入图片,然后
在文档里面保存数据

使用CVLOADIMAGE来载入数据,然后转换为BMP格式,这样还可以载入除BMP文件以外其他格式
在转换的过程中出现的问题是:文件大小的计算上,IPlimage转换为BMP的时候要注意BMP文件宽度的字节数必须是
4的整倍数,还有就是对于你要使用的空间一定要申请和释放,而且要注意大小
××××××××××××××××××××××××××××
利用对话框可以打开多个文件,见文件保存里面
×××××××××××××××××××××××××××
*******************************************************************************
BMP图像载入后copy问题还没解决
 这个问题似乎处在内存数据的copy的时候,大小的设置上有问题 ,还要解决这个问题
*******************************************************************************
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
对于一个大的系统考虑结构上的问题,对于一系列相干的数据封装在一个文件里面
必要的话对函数进行封装
在标定的程序里面 围绕着函数CVcalibratecamera2()建立一个数据结构,
输出:
   CvMat      *intrinsic_matrix   =0;   //内部参数矩阵
   CvMat      *distortion_coeffs  =0;   //畸变系数
   CvMat      *rotation_vectors   =0;   //旋转向量
   CvMat      *translation_vectors=0;   //平移向量
  
输入:
   CvMat      *points_counts      =0;   //图片角点数
   CvMat      * object_points     =0;   //世界坐标系中角点的坐标
   CvMat      *image_points       =0;   //检测到的角点坐标
   CvMat      *rotation_matrix    =0;   //旋转矩阵
 
对于相机的初始化参数建立一个结构
   int ChessBoardSize_w =6;       //角点个数
   int ChessBoardSize_h =7;
   int width_pixel      =640;     //像素
   int high_pixel       =512;
   int        NImages=13;   
   float      SquareSize=10;      //棋盘大小
  
这样对于程序的可读性有很好的帮助。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
对于标定函数本身的封装
//////////////////////////////////////////////////////////
输出文件的时候
void CCaneraView::PrintMat(CvMat *matrix)
{
    int i=0;
    int j=0;
    for(i=0;i < matrix->rows;i++)//行
    {
       
        m_CalibrateResolution.Format("/n");
        switch(matrix->type&0X07)
        {
        case CV_32F:
        case CV_64F:
            {
                for(j=0;j<matrix->cols;j++)//列
                {
                    m_CalibrateResolution.Format("%9.3f ",(float)cvGetReal2D(matrix,i,j));
                }
                break;
            }
        case CV_8U:
        case CV_16U:
            {
                for(j=0;j<matrix->cols;j++)
                {
                    m_CalibrateResolution.Format("%6d  ",(int)cvGetReal2D(matrix,i,j));
                }
               
                break;
            }
           
        default:
            break;
           
        }
    }
    AfxGetApp()->m_pMainWnd->Invalidate(FALSE);
    AfxGetApp()->m_pMainWnd->UpdateWindow();
}
的时候  输出不了矩阵,是每次调用forat的时候总是覆盖前面的数据
改为
void CCaneraView::PrintMat(CvMat *matrix,CPoint point)
{
    int i=0;
    int j=0;
    for(i=0;i < matrix->rows;i++)//行
    {
       
        m_CalibrateResolution.Format("/n");
        switch(matrix->type&0X07)
        {
        case CV_32F:
        case CV_64F:
            {
                for(j=0;j<matrix->cols;j++)//列
                {
                    m_CalibrateResolution.Format("%9.3f ",(float)cvGetReal2D(matrix,j,i));
                    this->GetDC()->TextOut(point.x+i*100,point.y+j*30,m_CalibrateResolution);
                }
                break;
            }
        case CV_8U:
        case CV_16U:
            {
                for(j=0;j<matrix->cols;j++)
                {
                    m_CalibrateResolution.Format("%6d  ",(int)cvGetReal2D(matrix,i,j));
                    this->GetDC()->TextOut(point.x+i*100,point.y+j*30,m_CalibrateResolution);
                }
               
                break;
            }
           
        default:
            break;
           
        }
    }
}就可以了
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
////////////////////////////////////////
对于文本的大量显示可以把VIEW类改为滚动条视图类
CStrolView是从Cview类中继承的
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
/////////////////////////////////////////
得到字体的大小
GetTextMetrics
The GetTextMetrics function
fills the specified buffer with the metrics for the currently selected font.
BOOL GetTextMetrics(
  HDC hdc,            // handle to device context
  LPTEXTMETRIC lptm   // pointer to text metrics structure
);

////////////////////////////
使用ONPAINT的重载来实现重绘
在使用这个函数的时候,使ONDRAW函数失效,而且当拉动画动条的时候 画出的图像移动
////////////////////
把view类改为CSCTOLLview类以后,设置的
void SetScrollSizes( int nMapMode, SIZE sizeTotal,//表示能拉到的距离
                       const SIZE& sizePage = sizeDefault,//滚动条的箭头在点击的时候拉动的大小
                        SIZE& sizeLine = sizeDefault );
           当视图陪更新的时候调用这个函数,可以在UPDATA里面调用这个函数来调整        
如果你设置的sizeTotal太小 就会看不到 滚动条   
滚动特性。UPDATA是在窗口改变的时候被框架调用      
///////////////////////////////////////
getwindow(),getoutputTextextent(),gettextExtent()得到的都不对!
请高手指点.
!!!是窗口的高度和宽度,也可以是窗口的对角坐标.
回复1:
GetWindowRect()
具体在察看Msdn的说明

回复2:
GetClientRect

回复3:
CRect Rect;
GetWindowRect(&Rect);
// 具体参数在Rect中

回复4:
GetClientRect().x,
GetClientRect().y

回复5:
CClient dc
dc.GetClientRect().x,
dc.GetClientRect().y
/////////////////////////////////////////////
图像拉伸后 很那看    
×××××××××××××××××××××××××××××××××
暂且把界面文本输出的问题放放,
先看看摄像机采集数据是存放在BYTE的缓冲区中,
先创建
 转换为iplimage的格式,
 俺现在才发现 似乎我利用原来的单帧采集 保存为BMP格式 然后在操作也没有太麻烦
 ××××××××××××××××××××××××××××××××××
这样的话 我不用再去做虾下面的了,我只用把标定的结果显示和图片的保存娴熟组号就可以了 耶!
       ×××××××××××××××××××××××××××××××××××××         
       窗口的问题解决,原来如此啊
       void CCaneraView::OnPaint( )
{
   CView::OnPaint( );//这里调用基类的函数 不是CCaneraView::OnPaint( )
   CPaintDC dc(this);
   dc.Ellipse(CRect(12,12,45,45));
}
  在使用自己从基类哪里继承的函数的时候要注意在自己的程序里面调用基类的函数 而且基类名要正确
×××××××××××××××××××××××××××××××××××
CString s1( "abc" );
CString s2( "def" );
ASSERT( (s1 + s2 ) == "abcdef" );
CString s3;
s3 = CString( "abc" ) + "def" ; // Correct
s3 = "abc" + "def";
// Wrong! The first argument must be a CString.
////////////////////////////////
今天要做的事:
1.数据的显示
2.文件的存储 得到的参数保存在文件标定中
3.内存释放的问题,现在程序在运行的时候占用的空间是17M
4.在标定结束后,初始化标定相关的数据标志
/////////////////////////////
    int hHcrollPos = GetScrollPos(SB_HORZ);获得滑动条的位置
    int vHcrollPos = GetScrollPos(SB_VERT);
    HDC tt;
    tt=::GetDC(::GetActiveWindow());//得到HDC和HWND
    SetWindowOrgEx(tt, -hHcrollPos, -vHcrollPos, NULL);//设置原点
    pDC->TextOut(100,0,"hjfgkjkhljklj");
SetWindowOrgEx(tt, 0, 0, NULL); //还原原点坐标
/////////////////////////////
界面更新的问题:
1.m_position这个变量在每次刷新后没有恢复到原来的位置,导致没刷新一次,位置都在改变,原来的文本就没有了
2.在标定的“图片显示里面我做了标定的初始化工作”,如果保存图像后再去动界面,界面对文本的刷新无效

如果动态开辟的存储空间没有得到有效的释放,在关闭程序的时候会出现 让你终止程序的恶心的对话框
对于开辟的空间要进行检测,可能会出问题

在函数里面传递参数的话 显示不出来啊????

对相关数据进行封装以后 程序的可读性和可操作性得到很好的提高

/////////////////////////////
内存泄漏的问题
开辟的空间重复开辟

重复的进行标定的话 就会出现这种问题 在任务管理器中就会发现 内存在每次标定后 增加内存的占有量
解决方法 :建立2组数据 一组做全局 一组做副本 在标定程序的执行周期内副本有效,在标定结束后副本释放
这样可以避免对数据的重复new
//////////////////////////////
21号10:32
通过设置一系列参数来判断是否要重新开辟空间
情况如下:
1.使用默认的参数,首次开辟空间
2.已经开辟了空间,载入相同数目的图片 其他参数也没变,这时候不需要开辟空间
3.已经开辟了空间,但是标定的参数已经改变,需要释放原有的空间,然后再去开辟新的空间


为啥在函数中空间得不到释放?

/////// 在MFC中原啦可以操作C语言的东西

//////////////////////////////////////////////
cvloadimage在函数里面自己分配内存
还有一个问题就是  我在没有执行标定操作的时候 关闭应用程序就会你弹出对话框,这是因为我没有开辟这些空间,
所以视图释放这些指针也是错误的

我在标定标志的类里面的m_showover作为相机曾经做过内存开辟的标志,在程序退出的时候可以用这个标志来
判断是不是要释放空间
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条