openCV视频流显示


一、灰度图动态显示

灰度图像视频显示编程思路:

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)         这里的boost1.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++中定义能自动匹配doubleint,如果进行了上述设置,代码中手动将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);

发布了18 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zengshaoqing/article/details/53053734
今日推荐