毕设图像处理——问题与心得(三)

昨晚上到今天成果不小,至少做出了大致的系统程序结构框架:

(前两天是处理如何外部载入图片,然后显示在界面上),大体结构是,1.先读取图片,显示在界面,2.然后设置索引文件目录(即图像索引库),3.然后递归查找指定图像目录的  指定后缀的文件,4.再一个个的调用函数 与原始图像进行对比处理,得到每个的相似度。对于相似度符合一定阈值的,将图像句柄添加到ImageList中,最后在一次性将Imagelist添加到界面绑定的ListBox Control 控件变量中,并显示。

   大体思路是这样,不过实现过程中的确遇到了不少问题,因为我本是对MFC菜鸟级别,所以想实现什么功能都是上网搜索,然后改成适用于自己的代码,左拼右凑当然一大堆问题。

1.设置索引文件目录,这里涉及到个线程问题 ,(我也不太明白为什么那个作者要重新设置线程),不过作为引用者,我的发现与遇到的问题是:新建线程(相关代码 CWinThread* pThreadAsu = AfxBeginThread(DoRecursive, this);)时候调用的函数:是静态函数(DoRecursive一定要声明成 UINT __cdecl CSearchImgDlg::DoRecursive( LPVOID lpParam )形式)。而且在静态函数中,一定必须调用静态变量,否则会报错【error C2597对非静态成员CSearchImgDlg  m_ListImage的非法引用】,

解决方法:

UINT __cdecl CSearchImgDlg::DoRecursive( LPVOID lpParam )

{

 CSearchImgDlg *p = (CSearchImgDlg *) lpParam;   //lpParam是线程传递的参数
 CWnd *w;

 //获得界面的控件的操作权

 w = (CWnd*) p->GetDlgItem(IDC_BT_OpenFile);  ////控件ID
 w->EnableWindow(FALSE);   ////设置控件ID属性

//调用本类中的各种方法,或自定义方法/ 或引用类变量

p->MessageBox("初始化image list");

p->类变量;

p->类自定义方法;

}

2.如何将图像句柄添加到ImageList中,参加源码:http://blog.csdn.net/byxdaz/article/details/4621328

我改用的时候,遇到两个错误,一个是我的CxImage库中没有Resample2()方法,所以我搜索了Resample()方法,其实一样,Resample()方法介绍 推荐网址:http://hi.baidu.com/altiplano/blog/item/d17b62632a0396650c33fac4.html,

二是没创建就向ImageList添加图片,结果运行中出现终止错误,估计可能溢出了,后来看了http://www.cppblog.com/totti1006/archive/2007/11/02/35764.aspx才明白,要先create,才能用

解决方法:

m_ListImage.Create(100, 60, ILC_COLOR32 | ILC_MASK, 0, 1);//前两个是图片的宽和高,倒数第二个是创建张数

然后再m_ListImage.Add(pBitmap,RGB(255,0,255));//运行就没问题了

3.将ImageList添加到ListBox Control 控件变量中,参考代码http://www.codeproject.com/Articles/2002/CListBoxST-a-CListBox-derived-control,不知道是不是因为在另一个线程方法中调用的缘故,listbox不显示添加的imageList,

不过后来我在线程函数,在ImageList添加到ListBox Control 后,加入p->m_ListResult.AddString(_T("测试"), i);(即添加完图片后,又仿着例子添加了静态文本)结果竟然显示了,— —诶,搞不懂,不过这里需要改进。

 

后面还有许多需要测试和改进。。先写到这里。。

 

 

 

你可能感兴趣的:(VC图像处理_之_毕设记录)