原创 2月份工作记录以及总结

2009-3-29 00:25 3240 7 7 分类: 软件与OS
    第一句话,这个月很少去上课........下个月要去上课,该看的上课的时候看完。
    我总在想自己这个月在做什么,回头想想似乎什么都没有做,除了连续一周没去上课,日子就这样过去了。我总在告诉自己每天总结一下自己做的事情,明天要做的事情,似乎并没有坚持那么久。这个月的日子并不好过,2月的工作没有做完在这个月的下旬我有用10天的时间去做这件事。这个月自己打算做的活其实在2周就草草做完了,后面还是做2月份的工作,结果还是不稳定。
   这个月自己补充的知识有:
图像处理关于像素的操作,区域操作,边界检测,灰度处理,中心点的检测,边界提取
数值计算:线性代数基础,线性方程求解,非线性方程的求解 矩阵理论里面关于矩阵分析的理论
关于摄像机标定:大概了解张征友的算法

     感触最深的是自己的基础太薄弱了,知识太凌乱,没有系统化的体系。你说自己的数学学过没有,学过,那你现在还能用吗?你是图像理论你学过没?学过,拿给你一幅图片你能处理没?一个程序你能写没?能,知识可以立即补,但是这是一个本科学生需要的吗?不是,不是吴军老师的话,这段时间一直觉得自己做事情,尤其是技术,过于心急,虽然可以打到预定的功能,但是和真正的代码笔记来,我只能那个“堆代码”来形容自己的代码,形容自己的理论体系》。。。。这真不为过。。。。。我,一个本科,最需要的是自己一个系统的知识体系,在自己动手的基础上,对自己的理论进行有目的的补充,这样自己在大学毕业的时候才有所不悔的地方,如果学了几年技术,会去学习,会去做,但是知识体系一塌糊涂,我觉得不能全怪教育制度。这些东西和会学习、能学习完全是2回事。会学习是一个人的理解能力以及把理论化为实际的能力,而现在是的知识层面的积累,需要的时间。
     有时候我在想,如果学过,用的时候再回头看看不就得了,或许是。但是如果最基本的数学方法都不会,对于程序中代码的优化,没有那种意识,无论如何你也不知道该去查什么东西。
     不说了,应该想着方面努力一下,虽然自己很懒。

今天老师说的对,事情确实很难做,不过还要做。
////////////////////////////////////////////////////////////////////
2009-3-2
 1。增加图像拷贝函数
 BOOL CopyBMPFile(BITMAPINFO *psrcbmpinfo,BYTE *psrcbmpdata,BITMAPINFO **pdestbmpinfo,BYTE **pdestbmpdata)
 函数里面通过判断函数指针是否weiNULL来决定是否开辟空间
所以在初始话指针的时候一定眼、要初始化为NULL
2.修改函数READBMPFILE
函数里面通过判断函数指针是否weiNULL来决定是否开辟空间
所以在初始话指针的时候一定眼、要初始化为NULL
3.修改函数ImgEDGE_BLUR()
修改循环里面的初始换,保证在每次计算的开始,使用+=  或者 ++ --的量回到初始值
4.建立IMGpro文件
3月4号
修改BMP文件的操作
1.增加函数 m_Palette=CreateBmpPalatte(pbmpinfo);
 来创建调色板,里面使用new来开辟Palette空间,没有在外面释放。如果使用MALLOC的话,在调用CREATEPALETTE的时候会出想错误。如果是24位 则返回空调色板
2.bmp文件操作的时候,使用BITMAPINFO来记录图像信息和颜色表的开始,
但是BITMAPINFO 44个字节 BITMAPFILE 40个字节
读取的时候 直接使用    nreadbyte=(*pbmpfh)->bfOffBits-sizeof(BITMAPFILEHEADER);来记录还要读取的数目
所以没有出现错误
3. 修改bmp读入函数,避免在重复读入数据的时候出现的内存泄漏问题
4. 修改显示函数,可以根据位数来创建调色板。
5. 增加返回颜色数目的函数 GetNumColors(BITMAPINFO *pbmpinfo)
6.修改保存函数可以保存位数不同的图片
3月5号
1.增加24位图转换为灰度图片函数
BOOL Rgb2Gray(BITMAPFILEHEADER **pbmpfh , BITMAPINFO **pbmpinfo , BYTE **pbmpdata)
函数在内部对BITMAPINFO和 PBmpda释放,然后重新分配空间
遇到的问题:
1.使用BITMAPINFO的方法错误,搞昏了BITMAPINFO的结构和BMP文件的存储格式。
  在文件的save的时候可以
          m_file.Write(&pbmphdr,sizeof(BITMAPFILEHEADER));
          m_file.Write(pbmpinfo,sizeof(BITMAPINFOHEADER));
          m_file.Write(ColorRGB,ColorNum * sizeof(RGBQUAD));
          在对bitmapinfo操作的时候,对颜色表不是简单的copy就可以的是,是在
          BITMAPINFO里面的IMCOLOR结构中进行初始化的
2.指针的操作

BOOL Rgb2Gray(BITMAPFILEHEADER *pbmpfh , BITMAPINFO *pbmpinfo , BYTE *pbmpdata)
如果你在内部开辟空间的话,是返回不了地址的(郁闷的是,自己竟然不知道原因)
3.其实,BITMAPINFOHEADER和后面的 颜色表以及数据是在一个内存块中的,完全可以通过只传递BITMAPINFO指针
通过地址来查找颜色表和其他数据 要修改的太多了,暂且不动库函数了
  3月7号
1。增加函数
 BOOL ImgSetPixel(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot pixel_coordinate,int pixel_value);
int  ImgGetPixel(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot pixel_coordinate);
来对像素点进行操作,但是这种操作的效率不高,因为每次都要计算图片的大下
2.阈值二值化函数
BOOL ImgThreshold(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,UINT threhold,UINT max_value , int threshold_type);
里面试根据大于某个值来处理的,、有
IMG_THRESHOLD_BINARY      0 二值化,大于阈值设定为max_value,否则为0
IMG_THRESHOLD_BINARY_INV  1 二值化,小于阈值设定为max_value,否则为0
IMG_THRESHOLD_TOZERO      2 二值化,大于阈值设定为0,否则为原来的数据
IMG_THRESHOLD_TOZERO_INV  3 二值化,小于阈值设定为max_value,否则为原数据
IMG_THRESHOLD_TRUNCATE    4 二值化,小于阈值设定为threhold,否则为0
四种模式,默认IMG_THRESHOLD_BINARY 
3.单个区域的边界跟踪问题
寻找第一个边界点
ImgDot ImgFindFirstDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int threshold);
BOOL ImgNextDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot *current , ImgDot *next , char *direction,int threshold);
int ImgSingleTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot *Begin_Dot,char Begin_direction,int *code);
BOOL ImgDrawTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int *code);
问题:只能对简单的图像进行跟踪,问题在方向的选取上。
疑惑:阈值问题挺混乱的,要规范化,
遇到的主要问题:指针与变量的使用。指针的赋值,阈值,,,,还有一些不该犯的低级错误
3月8号
1.阈值处理
二值化以后,得到255 0的图片,可以直接判断数据
如果是灰度图片的话,小于某个阈值来判断,这样的话,只能处理背景亮度比较高的图片
2.修改
BOOL ImgDrawTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int *code)函数
遇到的问题:
1.在一些极值的情况下,例如边界刚好和边缘重合的情况。
  在这种情况下,需要对边缘方向进行判断。
  如果只是想刚才那样进行极值处理,肯定只会在远处循环
2.
解决办法:
处于极值的情况有四种,分别处于四边,每种位置有两种情况,一种是沿着边缘出现边界,一种是在边缘处只出现
一个点。
对于沿着边界的边缘,改变方向,寻找转点,但是对于图像左面和图像下面的可以按照“向右看”的准则寻找,对于
上面和右面的按照向左看的准则比较好
鉴于边缘最好是封闭的情况,可以把图像的边缘作为边界来处理
2.对于北京比较暗、边界亮度也不太高的图片需要预处理的图片的检测,如果还是用上面的处理方法,检测不到点的。
要进行预处理才行

3月9号

1.增加4邻域 8邻域 左右看
2.需改BOOL ImgDrawTrace(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int *code,int black_or_white)函数,通过最后一个
参数来设置线条颜色

遗留问题:
搜索方向的改变以及搜索算法没有进行优化,可能会出现某个部分检测不到或者在某个角落里面进行死循环的
问题。还有就是阈值

3月10号

1.完成ImgCode2Line(code,LineCode);链表转换函数
注意:只对“向右看”的准则有效
遇到的问题是:在使用冒泡排序的时候,
     for (i = 1 ; i < Line_num ; i++ )
     {
         for (j = 0;j < Line_num - 1; j++)
        
         }
     }
j的范围设为for (j = 0;j < Line_num ; j++),造成超出范围

2.基于线段表的面积计算以及重心提取
long ImgOutlineArea(ImgDot *LineCode , int Line_num );
ImgDot ImgCenterGravity(ImgDot *LineCode , int Line_num);
BOOL ImgFillline(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot begin_dot,int len,int color);
BOOL ImgFillArea(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,ImgDot *LineCode , int Line_num,int color);
遇到的问题:
颜色填充的时候,使用像素操作得不到想要的结果,而使用线段填充就可以。还没有解决
  //for (j = 0 ; j < len ; j++)
         {
         ImgSetPixel(pbmpinfo,pbmpdata,LineCode[i+j],color);
     if (ImgGetPixel(pbmpinfo,pbmpdata,LineCode[i+j]) != color)
     {
         AfxMessageBox("!!");
         return FALSE;
             
        }
     }
    
3月17号
1.在对区域搜索函数里面,对链表的开辟的空间增加到2048个点,线段表增加到1024个数据
2。图片的坐标系是自上到下,而C语言函数里面的坐标是自下到上
   而且在函数int ImgSortLED(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,DImgDot *CenterDot)中
   搜索光笔中间直线的过程中,始终都是以最远的那个点为中心,说白了就是坐标的方向是不固定的
   唯一固定的就是点与点之间的相对关系。
3.做BOOL ImgSearchDot(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,int Init_deriction ,ImgDot *InitDot,int threhold,int flag)
方向搜索的时候,里面是通过对方向查表,得到下一个方向的坐标,通过寻址来得到坐标功能

这个函数虽然可以完成功能,但是很乱,而且稳定性不好,对中心线上面点的检测有问题


2月份剩下的几天要做的就是把这些代码优化
PARTNER CONTENT

文章评论0条评论)

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