一、灰度图动态显示
灰度图像视频显示编程思路:
在USB接收线程中判断当四幅相移图像接收完成后,进行深度图像计算,并将数据保存在对话框类的成员数组中。同时循环接收USB数据与动态显示灰度图像。
//在对话框类中创建类成员数组,保存图像数据
unsigned char inData[18432];
unsigned char img1[18432];
unsigned char img2[18432];
unsigned char img3[18432];
unsigned char img4[18432];
float dist[18432];
float amp[18432];
// Allocate an array and an image for the data
IplImage * frame = cvCreateImage (cvSize (numColumns, numRows), 8, 1);
IplImage * pdstframe = NULL;
UINT l,k;
l=0;
unsigned char Buffer[numRows][numColumns];
unsigned char dif1[18432];
unsigned char dif2[18432];
//按帧将数据保存并显示
if (i == 1)
{
memcpy(dlg->img1,dlg->inData,sizeof(dlg->inData));
}
else if (i==2)
{
memcpy(dlg->img2,dlg->inData,sizeof(dlg->inData));
}
else if (i==3)
{
memcpy(dlg->img3,dlg->inData,sizeof(dlg->inData));
}
else if (i==4)
{
memcpy(dlg->img4,dlg->inData,sizeof(dlg->inData));
i = 0;
}
for(j=0;j<18315;j++) //4步相移计算
{
dif1[j] = dlg->img3[j] - dlg->img1[j];
dif2[j] = dlg->img4[j] - dlg->img2[j];
dlg->dist[j] = /*3 - */C * atan(dif2[j]/(dif1[j]+0.0001/**/)) / (4*pi*fmod);
dlg->amp[j] = (double)sqrt(dif2[j] * dif2[j] + dif1[j] * dif1[j] * 1.00);
Buffer[l][j % numColumns] = dlg->amp[j];
if((j + 1) % numColumns == 0)
{
l = l + 1;
}
}
l = 0;
frame->imageData = (char *) Buffer;
//创建图像,并缩放
pdstframe = cvCreateImage(cvSize (numColumns * 2, numRows * 2), 8, 1);
cvResize(frame, pdstframe, CV_INTER_AREA);
cvShowImage ("image", pdstframe);
//Exit on q key or Escape
int c = cvWaitKey (1);
二、动态显示3D点云(按键控制)
3D点云动态显示编程思路:
首先按下开始采集按键,开始USB线程数据传输并显示灰度图像,再按下3D动态显示按键。开始传输后对话框类中的dist成员数组中已获得深度图像数据,再在3D动态显示按键事件处理函数中使用dist数组重建3D点云坐标,并显示3D点云。
void CTestDlg::OnBnClicked_3D_AutoShow()
{
// TODO: 在此添加控件通知处理程序代码
////////////////////点云滤波半径和最小邻点个数获取//////////////////
float Radius,MinNeighbors;
CString str;
GetDlgItemText(IDC_EDIT2,str);
Radius=atof(str);
GetDlgItemText(IDC_EDIT3,str);
MinNeighbors=atof(str);
////////////////////// 初始化////////////////////////
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->setBackgroundColor (0, 0, 0);
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setRadiusSearch(Radius); //0.002//0.018//0.014
outrem.setMinNeighborsInRadius (MinNeighbors); //2 //250 //190
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
/////////////////////////点云cloud初始化处理///////////////////////////////////////////////
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
cloud->width =18315; //////// 三维点云数据的个数!
cloud->height = 1;
cloud->is_dense = false;
cloud->points.resize ((cloud->width) *( cloud->height));
for (size_t i = 0; i < 18315; ++i) ///////// 三维点云数据的个数!
{
cloud->points[i].x =rand () / (RAND_MAX + 1.0f);
cloud->points[i].y =rand () / (RAND_MAX + 1.0f);
cloud->points[i].z =rand () / (RAND_MAX + 1.0f);////初始化为随机数,也可以初始化为0;
}
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
outrem.setInputCloud(cloud);
outrem.filter (*cloud_filtered);
viewer->addPointCloud<pcl::PointXYZ> (cloud_filtered, single_color, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");
viewer->initCameraParameters ();
//////////////////////////////////////深度数据处理中所需变量定义/////////////////////////////////
float matrix[111][165];
float X[111][165];
float Y[111][165];
int col,row;
float a,b;
while(!viewer->wasStopped ())
{
//////////////////////////////////深度距离图像存储为矩阵////////////////////////////////////////////////
int i=0, l=0; ///////这两个变量不可以放到while循环外面,否则有问题!
for(int k=0;k<=18314;k++)
{
matrix[l][k%165] = dist[k]; ////////////dist为类成员数组变量,------实时数据的来源------
if((k+1)%165==0)
{
l = l+1;
}
}
for(row=1;row<112;row++) ///////行与列从1开始的目的是什么,换成0开始怎么样
for(col=1;col<166;col++)
{
a = (float)(row-cc1)/fc1; //fc1=111, fc2=165, cc1=56, cc2=83
b = (float)(col-cc2)/fc2;
X[row-1][col-1] = a * (matrix[row-1][col-1]);
Y[row-1][col-1] = b * (matrix[row-1][col-1]);
cloud->points[i].x =X[row-1][col-1] ; //点云数据更新cloud中
cloud->points[i].y =Y[row-1][col-1] ;
cloud->points[i].z =matrix[row-1][col-1]; /////相当于深度
i++;
//cloud->points[i].x = (float)row/111; //点云数据更新cloud中
//cloud->points[i].y = (float)col/165;
//cloud->points[i].z = matrix[row-1][col-1]; /////相当于深度
//i++;
}
/////////////////////////////////////点云数据的显示/////////////////////////////////////////////
/*outrem.setInputCloud(cloud);
outrem.filter (*cloud_filtered);*/
viewer->updatePointCloud<pcl::PointXYZ>( cloud, single_color ,"sample cloud") ;
viewer->spinOnce (10);
boost::this_thread::sleep (boost::posix_time::microseconds (10));
}
}
三、openCV visual stdio2008环境配置
1、下载并解压OpenCV
下载到的文件名为“OpenCV-2.3.1-win-superpack.exe”,解压到任意一个文件夹,比如“D:\project_C_Plus”。
2、设置环境变量
OpenCV库函数需要通过用户环境变量调用所需要的库文件。点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里增加一项:
变量名:path
变量值:D:\project_C_Plus\opencv\build\x86\vc9\bin
如果已经有path项,在其变量值结尾添加英文分号“;”,再加上上面那个值。
3、创建并配置工程
新建一个空的控制台应用程序,编写openCV源程序后。右击工程名,选择属性(或项目->属性)。在弹出的属性页窗口中,配置中选择“Debug”(或者默认的“Active(Debug)”),平台选择“Win32”。
1)在左边选择配置属性->C/C++->常规,在右边的包含目录中,增加以下三项:
D:\project_C_Plus\opencv\build\include
D:\project_C_Plus\opencv\build\include\opencv
D:\project_C_Plus\opencv\build\include\opencv2
其实只需要填入第一行即可。由于“include\opencv”包含C版本的头文件,“include\opencv2”包含C++版本的头文件。所以编写代码时,在头文件名称前加上“opencv/”或“opencv2/”来区分两种版本。
2)在链接器->常规->附加库目录中增加以下一项:
D:\project_C_Plus\opencv\build\x86\vc9\lib
把配置改为“Release”,然后对配置属性->C/C++->常规->包含目录和链接器->常规->附加库目录做同样的修改。
3)在链接器->输入->附加依赖项中增加以下库:
opencv_calib3d231d.lib
opencv_contrib231d.lib
opencv_core231d.lib
opencv_features2d231d.lib
opencv_flann231d.lib
opencv_gpu231d.lib
opencv_highgui231d.lib
opencv_imgproc231d.lib
opencv_legacy231d.lib
opencv_ml231d.lib
opencv_objdetect231d.lib
opencv_ts231d.lib
opencv_video231d.lib
4)把配置改为“Release”,在链接器->输入->附加依赖项中增加以下库:(在文件名上的区别仅在于在末尾少了一个“d”)
opencv_calib3d231.lib
opencv_contrib231.lib
opencv_core231.lib
opencv_features2d231.lib
opencv_flann231.lib
opencv_gpu231.lib
opencv_highgui231.lib
opencv_imgproc231.lib
opencv_legacy231.lib
opencv_ml231.lib
opencv_objdetect231.lib
opencv_ts231.lib
opencv_video231.lib
四、PCL visual stdio2008环境配置
1、点击VC++目录(VC++ Directories),
1)在包含目录(Include Directories)里添加:
D:\Program Files\PCL 1.5.1\3rdParty\Boost\include;
D:\Program Files\PCL 1.5.1\3rdParty\Eigen\include;
D:\Program Files\PCL 1.5.1\3rdParty\Flann\include;
D:\Program Files\PCL 1.5.1\3rdParty\Qhull\include;
D:\Program Files\PCL 1.5.1\3rdParty\VTK\include\vtk-5.8;
D:\Program Files\OpenNI\Include;
D:\Program Files\PCL 1.5.1\include\pcl-1.5;
2)在库目录里(Library Directories)添加:
D:\Program Files\PCL 1.5.1\3rdParty\Boost\lib;
D:\Program Files\PCL 1.5.1\3rdParty\Qhull\lib;
D:\Program Files\PCL 1.5.1\3rdParty\Flann\lib;
D:\Program Files\PCL 1.5.1\3rdParty\VTK\lib\vtk-5.8;
D:\Program Files\PCL 1.5.1\lib;
D:\Program Files\OpenNI\Lib;
2、选择Debug|win32,链接器->输入->附加依赖项里边添加:
opengl32.lib
pcl_common_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_io_debug.lib
pcl_io_ply_debug.lib
pcl_kdtree_debug.lib
pcl_keypoints_debug.lib
pcl_octree_debug.lib
pcl_outofcore_debug.lib
pcl_people_debug.lib
pcl_recognition_debug.lib
pcl_registration_debug.lib
pcl_sample_consensus_debug.lib
pcl_search_debug.lib
pcl_segmentation_debug.lib
pcl_surface_debug.lib
pcl_tracking_debug.lib
pcl_visualization_debug.lib
boost_chrono-vc100-mt-gd-1_49.lib
boost_date_time-vc100-mt-gd-1_49.lib
boost_filesystem-vc100-mt-gd-1_49.lib
boost_graph-vc100-mt-gd-1_49.lib
boost_graph_parallel-vc100-mt-gd-1_49.lib
boost_iostreams-vc100-mt-gd-1_49.lib
boost_locale-vc100-mt-gd-1_49.lib
boost_math_c99-vc100-mt-gd-1_49.lib
boost_math_c99f-vc100-mt-gd-1_49.lib
boost_math_tr1-vc100-mt-gd-1_49.lib
boost_math_tr1f-vc100-mt-gd-1_49.lib
boost_mpi-vc100-mt-gd-1_49.lib
boost_prg_exec_monitor-vc100-mt-gd-1_49.lib
boost_program_options-vc100-mt-gd-1_49.lib
boost_random-vc100-mt-gd-1_49.lib
boost_regex-vc100-mt-gd-1_49.lib
boost_serialization-vc100-mt-gd-1_49.lib
boost_signals-vc100-mt-gd-1_49.lib
boost_system-vc100-mt-gd-1_49.lib
boost_thread-vc100-mt-gd-1_49.lib
boost_timer-vc100-mt-gd-1_49.lib
boost_unit_test_framework-vc100-mt-gd-1_49.lib
boost_wave-vc100-mt-gd-1_49.lib
boost_wserialization-vc100-mt-gd-1_49.lib
libboost_chrono-vc100-mt-gd-1_49.lib
libboost_date_time-vc100-mt-gd-1_49.lib
libboost_filesystem-vc100-mt-gd-1_49.lib
libboost_graph_parallel-vc100-mt-gd-1_49.lib
libboost_iostreams-vc100-mt-gd-1_49.lib
libboost_locale-vc100-mt-gd-1_49.lib
libboost_math_c99-vc100-mt-gd-1_49.lib
libboost_math_c99f-vc100-mt-gd-1_49.lib
libboost_math_tr1-vc100-mt-gd-1_49.lib
libboost_math_tr1f-vc100-mt-gd-1_49.lib
libboost_mpi-vc100-mt-gd-1_49.lib
libboost_prg_exec_monitor-vc100-mt-gd-1_49.lib
libboost_program_options-vc100-mt-gd-1_49.lib
libboost_random-vc100-mt-gd-1_49.lib
libboost_regex-vc100-mt-gd-1_49.lib
libboost_serialization-vc100-mt-gd-1_49.lib
libboost_signals-vc100-mt-gd-1_49.lib
libboost_system-vc100-mt-gd-1_49.lib
libboost_test_exec_monitor-vc100-mt-gd-1_49.lib
libboost_thread-vc100-mt-gd-1_49.lib
libboost_timer-vc100-mt-gd-1_49.lib
libboost_unit_test_framework-vc100-mt-gd-1_49.lib
libboost_wave-vc100-mt-gd-1_49.lib
libboost_wserialization-vc100-mt-gd-1_49.lib
MapReduceMPI-gd.lib
mpistubs-gd.lib
vtkalglib-gd.lib
vtkCharts-gd.lib
vtkCommon-gd.lib
vtkDICOMParser-gd.lib
vtkexoIIc-gd.lib
vtkexpat-gd.lib
vtkFiltering-gd.lib
vtkfreetype-gd.lib
vtkftgl-gd.lib
vtkGenericFiltering-gd.lib
vtkGeovis-gd.lib
vtkGraphics-gd.lib
vtkhdf5-gd.lib
vtkHybrid-gd.lib
vtkImaging-gd.lib
vtkInfovis-gd.lib
vtkIO-gd.lib
vtkjpeg-gd.lib
vtklibxml2-gd.lib
vtkmetaio-gd.lib
vtkNetCDF-gd.lib
vtkNetCDF_cxx-gd.lib
vtkpng-gd.lib
vtkproj4-gd.lib
vtkRendering-gd.lib
vtksqlite-gd.lib
vtksys-gd.lib
vtktiff-gd.lib
vtkverdict-gd.lib
vtkViews-gd.lib
vtkVolumeRendering-gd.lib
vtkWidgets-gd.lib
vtkzlib-gd.lib
flann-gd.lib
flann_cpp_s-gd.lib
flann_cuda_s-gd.lib
flann_s-gd.lib
1) 这些库是在编译Debug版本时得到的链接库,每个链接库的名称中都带有_debug或者-gd等信息,非常容易识别。这些内容存储在相应库的lib文件夹下,如" D:\Program Files\PCL 1.5.1\lib \pcl_common_debug.lib"。
2) 这里的boost是1.49版本,所以boost后面都是_49结尾,这里不是拷贝过去就可以用的,若用的是1.50版本,需要更改名称。
3、选择Release|win32,链接器->输入->附加依赖项里边添加:
pcl_common_release.lib
pcl_features_release.lib
pcl_filters_release.lib
pcl_io_ply_release.lib
pcl_io_release.lib
pcl_kdtree_release.lib
pcl_keypoints_release.lib
pcl_octree_release.lib
pcl_outofcore_release.lib
pcl_people_release.lib
pcl_recognition_release.lib
pcl_registration_release.lib
pcl_sample_consensus_release.lib
pcl_search_release.lib
pcl_segmentation_release.lib
pcl_surface_release.lib
pcl_tracking_release.lib
pcl_visualization_release.lib
boost_chrono-vc100-mt-1_49.lib
boost_date_time-vc100-mt-1_49.lib
boost_filesystem-vc100-mt-1_49.lib
boost_graph-vc100-mt-1_49.lib
boost_graph_parallel-vc100-mt-1_49.lib
boost_iostreams-vc100-mt-1_49.lib
boost_locale-vc100-mt-1_49.lib
boost_math_c99-vc100-mt-1_49.lib
boost_math_c99f-vc100-mt-1_49.lib
boost_math_tr1-vc100-mt-1_49.lib
boost_math_tr1f-vc100-mt-1_49.lib
boost_mpi-vc100-mt-1_49.lib
boost_prg_exec_monitor-vc100-mt-1_49.lib
boost_program_options-vc100-mt-1_49.lib
boost_random-vc100-mt-1_49.lib
boost_regex-vc100-mt-1_49.lib
boost_serialization-vc100-mt-1_49.lib
boost_signals-vc100-mt-1_49.lib
boost_system-vc100-mt-1_49.lib
boost_thread-vc100-mt-1_49.lib
boost_timer-vc100-mt-1_49.lib
boost_unit_test_framework-vc100-mt-1_49.lib
boost_wave-vc100-mt-1_49.lib
boost_wserialization-vc100-mt-1_49.lib
libboost_chrono-vc100-mt-1_49.lib
libboost_date_time-vc100-mt-1_49.lib
libboost_filesystem-vc100-mt-1_49.lib
libboost_graph_parallel-vc100-mt-1_49.lib
libboost_iostreams-vc100-mt-1_49.lib
libboost_locale-vc100-mt-1_49.lib
libboost_math_c99-vc100-mt-1_49.lib
libboost_math_c99f-vc100-mt-1_49.lib
libboost_math_tr1-vc100-mt-1_49.lib
libboost_math_tr1f-vc100-mt-1_49.lib
libboost_mpi-vc100-mt-1_49.lib
libboost_prg_exec_monitor-vc100-mt-1_49.lib
libboost_program_options-vc100-mt-1_49.lib
libboost_random-vc100-mt-1_49.lib
libboost_regex-vc100-mt-1_49.lib
libboost_serialization-vc100-mt-1_49.lib
libboost_signals-vc100-mt-1_49.lib
libboost_system-vc100-mt-1_49.lib
libboost_test_exec_monitor-vc100-mt-1_49.lib
libboost_thread-vc100-mt-1_49.lib
libboost_timer-vc100-mt-1_49.lib
libboost_unit_test_framework-vc100-mt-1_49.lib
libboost_wave-vc100-mt-1_49.lib
libboost_wserialization-vc100-mt-1_49.lib
MapReduceMPI.lib
mpistubs.lib
vtkalglib.lib
vtkCharts.lib
vtkCommon.lib
vtkDICOMParser.lib
vtkexoIIc.lib
vtkexpat.lib
vtkFiltering.lib
vtkfreetype.lib
vtkftgl.lib
vtkGenericFiltering.lib
vtkGeovis.lib
vtkGraphics.lib
vtkhdf5.lib
vtkHybrid.lib
vtkImaging.lib
vtkInfovis.lib
vtkIO.lib
vtkjpeg.lib
vtklibxml2.lib
vtkmetaio.lib
vtkNetCDF.lib
vtkNetCDF_cxx.lib
vtkpng.lib
vtkproj4.lib
vtkRendering.lib
vtksqlite.lib
vtksys.lib
vtktiff.lib
vtkverdict.lib
vtkViews.lib
vtkVolumeRendering.lib
vtkWidgets.lib
vtkzlib.lib
flann.lib
flann_cpp_s.lib
flann_cuda_s.lib
flann_s.lib
这些库是在编译Release版本时得到的链接库,每个链接库的名称中都带有_release或者_s等信息,以区别于Debug版本。这些内容存储在相应库的lib文件夹下,如" D:\Program Files\PCL 1.5.1\lib \pcl_common_release.lib"
4、最后把用到的dll目录设置到环境中去,打开计算机->系统属性->高级系统设置->环境变量,在环境变量中添加:
D:\Program Files\PCL 1.5.1\bin;
D:\Program Files\PCL 1.5.1\3rdParty\FLANN\bin;
D:\Program Files\PCL 1.5.1\3rdParty\Qhull\bin;
D:\Program Files\PCL 1.5.1\3rdParty\Eigen\bin;
D:\Program Files\OpenNI\Bin
附录 openCV 与PCL库 Debug
1、Opencv+PCL=Flann 冲突
原因是opencv头文件中也有个在include/opencv/opencv2/flann.hpp,会干扰。
首先,注意添加include路径顺序,先pcl库后opencv
然后,编译会遇到错误代码:
1>D:\Program Files\PCL 1.5.1\include\pcl-1.5\pcl/kdtree/kdtree_flann.h(443) : error C2872: “flann”: 不明确的符号
1> 可能是“flann”
1> 或 “cv::flann”
表明flann有歧义,pcl和opencv都使用,产生了冲突。
最后注释掉 using namespace cv; 并openCV 的函数前使用域名cv:: 来解决。
2、min 和 max与Visual C++中的全局的宏min max冲突
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/common/impl/common.hpp(217) : warning C4003: “min”宏的实参不足
1> D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/common/impl/common.hpp(218) : warning C4003: “max”宏的实参不足
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2589: “(”: “::”右边的非法标记
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2143: 语法错误 : 缺少“)”(在“::”的前面)
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2612: 基/成员初始值设定项列表中的非法后缀“::”
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2589: “(”: “::”右边的非法标记
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2143: 语法错误 : 缺少“;”(在“::”的前面)
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(71) : error C2059: 语法错误 : “)”
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(72) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(94) : error C2065: “Correspondences”: 未声明的标识符
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(95) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(95) : error C2146: 语法错误 : 缺少“,”(在标识符“Correspondences”的前面)
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(95) : error C2065: “Correspondences”: 未声明的标识符
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(111) : error C2039: “Correspondences”: 不是“pcl”的成员
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(111) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(111) : error C2143: 语法错误 : 缺少“,”(在“&”的前面)
1> D:\Program Files (x86)\PCL 1.5.1\include\pcl-1.5\pcl/correspondence.h(121) : fatal error C1903: 无法从以前的错误中恢复;正在停止编译
解决办法:
设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Visual C++的min/max宏定义。
项目属性-> C/C++ -> 预处理器 -> 预处理器定义(此处添加预定义编译开关 NOMINMAX)
但是visual C++中定义能自动匹配double和int,如果进行了上述设置,代码中手动将int型的数据乘以1.0来达到double的目的。
3、error C2589: “(”: “::”右边的非法标记;error C2059: 语法错误 : “::”
1>D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\complex(365) : error C2589: “(”: “::”右边的非法标记
1> D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\complex(365) : error C2059: 语法错误 : “::”
解决办法:
加上括号,与Vsual C++的min/max宏定义区分开,如下:
size.Width = std::max(size.Width, elementSize.Width);
size.Width = (std::max)(size.Width, elementSize.Width);