结构光传感器编程(二十一)
一、从VS2010移植到VS2013时,出现:
vs2013 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.
问题解释:
用于多字节字符编码 (MBCS) 的 MFC 库 (DLL) 不再包含于 Visual Studio 中,但是可用作插件,可以在任何装有 Visual Studio Professional、Visual Studio Premium 或 Visual Studio Ultimate 的计算机上下载和安装。(在 Visual Studio 中,必须启用 MFC。)安装需要大约 440 MB 磁盘空间,包括英语(美国)和 DLL 的本地化版本。
问题根源:
VS2013缺少MFC MBCS DLL加载项。其中MBCS为多字节字符编码。
解决方案:
下载Multibyte MFC Library for Visual Studio 2013,安装即可,安装过程关掉vs。公众号后台回复:VC_MBCSMFC 即可获得。
注意:若安装未成功,可尝试以管理员身份进行安装。
二、采集图像相机时,在类内定义图像类型无法在外部采集,需要定义成全局变量:
IplImage * image;
IplImage * lastImage;
IplImage * curentImage;
IplImage * lastImageProcess;
IplImage * curentImageProcess;
BYTE *m_pBufferRaw=NULL; ///< 图像原始数据
Mat dstImage; //图像处理用到的Mat变量
定义成全局变量以后不需要释放变量,如果释放,快速点击采集可能会出现问题。
//if (image != NULL)
//{
// cvReleaseImage(&image);
//}
//if (lastImage != NULL)
//{
// cvReleaseImage(&lastImage);
//}
//if (curentImage != NULL)
//{
// cvReleaseImage(&curentImage);
//}
//if (lastImageProcess != NULL)
//{
// cvReleaseImage(&lastImageProcess);
//}
//if (curentImageProcess != NULL)
//{
// cvReleaseImage(&curentImageProcess);
//}
//全局变量,不需要释放内存,若释放,仿真时多次快速点击停止采集可能会出现问题。
三、在图像处理之前,需要先创建图像
//创建图像(点击开始采集按钮,创建一次图像,停止采集的时候,需要释放内存)
image = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), IPL_DEPTH_8U, 1);
curentImage = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), IPL_DEPTH_8U, 1);
lastImage = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), IPL_DEPTH_8U, 1);
lastImageProcess = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), IPL_DEPTH_8U, 1);
curentImageProcess = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), IPL_DEPTH_8U, 1);
四、设置摄像机参数,配置文件中读取参数
int len = strlen(m_device1InternalFile);char *ptxtTemp = new char[len+1]; memcpy(ptxtTemp, m_device1InternalFile, len);ptxtTemp[len] = '\0';cout << ptxtTemp << endl;bool ret = LSHD6_SetCameraParameter(1, ptxtTemp);
五、采集图像过程中需要上锁,以免程序发生错误
//使用同步类
#include 'afxmt.h'
CCriticalSection critical_section; //同步类,全局变量采集到的图片互锁
critical_section.Lock();
critical_section.Unlock();
六、图像的保存
//////////////图像保存处理///////////////////if (m_bIsSaveImg){ snFrame1.Format('%d_1.bmp', nFrame); snFrame2.Format('%d_2.bmp', nFrame); snFrame3.Format('%d_3.bmp', nFrame); snFrameString = './CaptureImage\\' + snFrame1; //不会自动创建文件夹,只会把文件保存到特定的位置 cvSaveImage(snFrameString, lastImageProcess);}
七、清空列表
m_ListWords.ResetContent();// 清空该列表
八、网络事件添加
virtual BOOL PreTranslateMessage(MSG* pMsg);
BOOL PreTranslateMessage(MSG* pMsg)
{
//添加的网络通信的消息事件
if (pMsg->message == 20000)
{
this->HandleData();
}
if (pMsg->message == 30000)
{
switch (pMsg->lParam)
{
case FD_READ:
this->ReceiveSendData();
break;
case FD_CLOSE:
this->CloseSock();
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
赞 (0)