版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器视觉技术1——程光主编李一男副主编2目录1机器视觉概述2机器视觉系统构成3NI视觉平台的搭建4LabVIEW编程环境与基本操作5LabVIEW编程结构6LabVIEW数组、簇、图形编程7字符串、文件I/O和属性节点编程8图像的采集保存与读取9相机标定10图像处理11视觉分拣12基于OpenCV的视觉分拣第十二章基于OpenCV的视觉分拣3在前一章节中,我们在Labview平台上通过NIVISION视觉包进行了视觉分拣。本节我们将在VS平台上通过OpenCV视觉库完成同样的任务。在开发前,我们需要安装VisualStudio2010、OpenCV、Balser的SDK开发包等软件,最后通过网络调试助手进行通讯测试。基于OpenCV的视觉分拣项目由四个部分构成:①环境配置;②在VS上用SDK相机开发包调用Balser相机(完成图像采集);③用OpenCV进行图像处理;④计算机作为服务端,用TCP/IP协议完成和机器人的通讯。下面分别进行介绍。12.1环境配置4第十二章基于OpenCV的视觉分拣我们使用MicrosoftVisualStudio2010作为开发平台,通过Basler提供的pylonSDK工具包进行图像的采集,采集后的图像通过opencv进行处理。因此我们需要安装以上3个软件并进行参数的配置。1.MicrosoftVisualStudio2010①首先,先解压ISO镜像文件,接着双击“autorun.exe”开始安装,如图12-1所示:图12-1安装VS12.1环境配置5第十二章基于OpenCV的视觉分拣②点击“安装MicrosoftVisualStudio2010”,如图12-2所示:③点击“安装MicrosoftVisualStudio2010”:④点击“下一步”,如图12-3所示:图12-2安装VS图12-3安装VS12.1环境配置6第十二章基于OpenCV的视觉分拣⑤点击“我已阅读并接受许可条款”,再点击“下一步”,如图12-4所示:⑥点击“自定义”并选择您的安装目录,如图12-5所示:图12-4安装VS图12-5安装VS12.1环境配置7第十二章基于OpenCV的视觉分拣⑦选择您要安装的功能,如图12-6所示:⑧点击“安装”安装程序就开始安装,如图12-7所示。注意:安装程序在安装时,可能会重启系统。图12-6安装VS图12-7安装VS12.1环境配置8第十二章基于OpenCV的视觉分拣⑧安装成功!如图12-8所示:2.Basler_pylon_5.0.10.10613①双击“Basler_pylon_5.0.10.10613.exe”②选择“Modifythecurrentinstallation”,点击“Next”,如图12-9所示:图12-8安装VS图12-9安装Balser驱动12.1环境配置9第十二章基于OpenCV的视觉分拣③选择“Developer”,点击“Next”,如图12-10所示:图12-10安装Balser驱动④选择“GigE”,点击“Next”,如图12-11所示:图12-11安装Balser驱动12.1环境配置10第十二章基于OpenCV的视觉分拣⑤点击“Install”,进行安装。⑥安装完成后,打开文件夹,如图12-12所示。其中SDK在Development文件夹下。图12-12安装Balser驱动3.Opencv①双击“opencv-2.4.9.exe”②选择解压路径后,点击“Extract”,如图12-13所示:图12-13安装Opencv12.1环境配置11第十二章基于OpenCV的视觉分拣软件安装成功后,进行环境的配置:1.Pylon配置当我们选择C++为开发环境时,正确安装运行环境、驱动和SDK后,pylon程序已经增加了以下环境变量。PYLON5:PYLON_DEV_DIR如图12-14所示:图12-14Pylon配置12.1环境配置12第十二章基于OpenCV的视觉分拣在VS的配置中需要增加:①ConfigurationProperties->C/C++->General->AdditionalIncludeDirectories):Pylon5:$(PYLON_DEV_DIR)\include②ConfigurationProperties->Linker->General->AdditionalLibraryDirectoriesPylon5:$(PYLON_DEV_DIR)\lib\Win32;ConfigurationProperties->C/C++->Language->EnableRuntimeTypeInfoYesConfigurationProperties->C/C++->CodeGeneration->EnableC++ExceptionsYes12.1环境配置13第十二章基于OpenCV的视觉分拣2.Opencv配置①配置环境变量计算机->(右键)属性->高级系统设置->高级(标签)->环境变量->(双击)path(用户,系统里面的path任选其一)->在变量值里面添加相应的路径。对于32位系统,就添加:“……opencv\build\x86\vc10\bin”而对于64位系统,可以两个都添加上:“……opencv\build\x86\vc10\bin”和“……opencv\build\x64\vc10\bin”,②工程包含(include)目录的配置<视图>--<属性管理器>如图12-15所示:图12-15Opencv配置12.1环境配置14第十二章基于OpenCV的视觉分拣在新出现的“属性管理器”工作区中,点击项目->Debug|Win32->Microsoft.Cpp.Win32.userDirectories(反键属性,或者双击)即可打开属性页面。如图12-16所示:图12-16Opencv配置12.1环境配置15第十二章基于OpenCV的视觉分拣首先是在【通用属性】->【VC++目录】->【包含目录中】,如图12-17所示:添加上D:\ProgramFiles\opencv\build\includeD:\ProgramFiles\opencv\build\include\opencvD:\ProgramFiles\opencv\build\include\opencv2这三个目录。如图12-18所示:图12-17Opencv配置图12-18Opencv配置16第十二章基于OpenCV的视觉分拣③工程库(lib)目录的配置【通用属性】->【VC++目录】->【库目录】。如图12-19所示:图12-20Opencv配置添加上D:\ProgramFiles\opencv\build\x86\vc10\lib这个路径。④链接库的配置【通用属性】->【链接器】->【输入】->【附加的依赖项】。如图12-20所示:17第十二章基于OpenCV的视觉分拣添加如下内容:opencv_ml249d.libopencv_calib3d249d.libopencv_contrib249d.libopencv_core249d.libopencv_features2d249d.libopencv_flann249d.libopencv_gpu249d.libopencv_highgui249d.libopencv_imgproc249d.libopencv_legacy249d.libopencv_objdetect249d.libopencv_ts249d.libopencv_video249d.libopencv_nonfree249d.libopencv_ocl249d.libopencv_photo249d.libopencv_stitching249d.libopencv_superres249d.libopencv_videostab249d.libopencv_objdetect249.libopencv_ts249.libopencv_video249.libopencv_nonfree249.libopencv_ocl249.libopencv_photo249.libopencv_stitching249.libopencv_superres249.libopencv_videostab249.libopencv_calib3d249.libopencv_contrib249.libopencv_core249.libopencv_features2d249.libopencv_flann249.libopencv_gpu249.libopencv_highgui249.libopencv_imgproc249.libopencv_legacy249.libopencv_ml249.lib重新启动之后,配置即可完成。12.2利用相机提供的SDK工具包完成图像采集18第十二章基于OpenCV的视觉分拣//定义是否保存图片#definesaveImages1//定义是否记录视频#definerecordVideo1//加载OpenCVAPI#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/video/video.hpp>//加载PYLONAPI.#include<pylon/PylonIncludes.h>#include<iostream>#ifdefPYLON_WIN_BUILD#include<pylon/PylonGUI.h>#endif//命名空间.usingnamespacePylon;usingnamespacecv;usingnamespacestd;//定义抓取的图像数staticconstuint32_tc_countOfImagesToGrab=10;voidmain(){//Pylon自动初始化和终止
Pylon::PylonAutoInitTermautoInitTerm;try{//创建相机对象
CInstantCameracamera(CTlFactory::GetInstance().CreateFirstDevice());//打印相机的名称
std::cout<<"Usingdevice"<<camera.GetDeviceInfo().GetModelName()<<endl;//获取相机节点映射以获得相机参数
GenApi::INodeMap&nodemap=camera.GetNodeMap();
//打开相机
camera.Open();12.2利用相机提供的SDK工具包完成图像采集19第十二章基于OpenCV的视觉分拣//获取相机成像宽度和高度
GenApi::CIntegerPtrwidth=nodemap.GetNode("Width");GenApi::CIntegerPtrheight=nodemap.GetNode("Height");//设置相机最大缓冲区,默认为10camera.MaxNumBuffer=5;//新建pylonImageFormatConverter对象.CImageFormatConverterformatConverter;//确定输出像素格式
formatConverter.OutputPixelFormat=PixelType_BGR8packed;//创建一个Pylonlmage后续将用来创建OpenCVimagesCPylonImagepylonImage;//声明一个整形变量用来计数抓取的图像,以及创建文件名索引intgrabbedlmages=0;//新建一个OpenCVvideocreator对象.VideoWritercvVideoCreator;//新建一个OpenCVimage对象.MatopenCvImage;//视频文件名
std::stringvideoFileName="openCvVideo.avi";//定义视频帧大小
cv::SizeframeSize=Size((int)width->GetValue(),(int)height->GetValue());//设置视频编码类型和帧率
cvVideoCreator.open(videoFileName,CV_FOURCC('D','I','V','X'),10,frameSize,true);//开始抓取c_countOfImagesToGrabimages.//相机默认设置连续抓取模式
camera.StartGrabbing(c_countOfImagesToGrab,GrabStrategy_LatestImageOnly);//抓取结果数据指针
CGrabResultPtrptrGrabResult;//当c_countOfImagesToGrabimages获取恢复成功时,Camera.StopGrabbing()//被RetrieveResult()方法自动调用停止抓取while(camera.IsGrabbing()){20第十二章基于OpenCV的视觉分拣//等待接收和恢复图像,超时时间设置为5000ms.camera.RetrieveResult(5000,ptrGrabResult,TimeoutHandling_ThrowException);//如果图像抓取成功if(ptrGrabResult->GrabSucceeded()){//获取图像数据
cout<<"SizeX:"<<ptrGrabResult->GetWidth()<<endl;cout<<"SizeY:"<<ptrGrabResult->GetHeight()<<endl;//将抓取的缓冲数据转化成pylonimage.formatConverter.Convert(pylonImage,ptrGrabResult);//将pylonimage转成OpenCVimageopenCvImage=cv::Mat(ptrGrabResult->GetHeight(),ptrGrabResult->GetWidth(),CV_8UC3,(uint8_t*)pylonImage.GetBuffer());//如果需要保存图片if(saveImages){std::ostringstreams;//按索引定义文件名存储图片
s<<"image_"<<grabbedlmages<<".jpg";std::stringimageName(s.str());//保存OpenCVimage.imwrite(imageName,openCvImage);grabbedlmages++;}//如果需要记录视频if(recordVideo){cvVideoCreator.write(openCvImage);}//新建OpenCVdisplaywindow.namedWindow("OpenCVDisplayWindow",CV_WINDOW_NORMAL);//显示及时影像.imshow("OpenCVDisplayWindow",openCvImage);waitKey(0);}}}21第十二章基于OpenCV的视觉分拣catch(GenICam::GenericException&e){//Errorhandling.cerr<<"Anexceptionoccurred."<<endl<<e.GetDescription()<<endl;}return;}其中,具体函数的使用可参考Balser提供的使用指南,我们可以在balser的安装目录下找到。如图12-21所示:22第十二章基于OpenCV的视觉分拣catch(GenICam::GenericException&e){//Errorhandling.cerr<<"Anexceptionoccurred."<<endl<<e.GetDescription()<<endl;}return;}其中,具体函数的使用可参考Balser提供的使用指南,我们可以在balser的安装目录下找到。如图12-21所示:图12-21SDK开发目录23第十二章基于OpenCV的视觉分拣参考的代码示例也可以在balser的安装目录下找到。如图12-22所示:图12-22SDK案例12.3用Opencv完成图像处理24第十二章基于OpenCV的视觉分拣#include<iostream>#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"usingnamespacecv;usingnamespacestd;intmain(intargc,char**argv){ MatsrcImage=imread("1.jpg"); MatdstImage; MatimgThreshold; Matcanny_output; RNGrng(1234); Stringstring1; doubleg_dConArea=0; vector<vector<Point>>contours;vector<Vec4i>hierarchy; namedWindow("【原始图】",CV_WINDOW_AUTOSIZE);imshow("【原始图】",srcImage); //将色彩空间由RGB转换为HSV
//cvtColor(srcImage,dstImage,COLOR_BGR2HSV);while(true){//提取红色(8位图)
inRange(srcImage,Scalar(60,50,150),Scalar(110,100,200),imgThreshold); //开操作(去除一些噪点)Matelement=getStructuringElement(MORPH_RECT,Size(5,5));morphologyEx(imgThreshold,imgThreshold,MORPH_OPEN,element);//闭操作(连接一些连通域)
morphologyEx(imgThreshold,imgThreshold,MORPH_CLOSE,element);blur(imgThreshold,imgThreshold,Size(3,3));//用Canny算子检测边缘
Canny(imgThreshold,canny_output,3,9,3);//寻找轮廓
findContours(canny_output,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//绘出轮廓
Matdrawing=Mat::zeros(canny_output.size(),CV_8UC3); for(inti=0;i<contours.size();i++){12.3用Opencv完成图像处理25第十二章基于OpenCV的视觉分拣Scalarcolor=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));drawContours(drawing,contours,i,color,3,8,hierarchy,0,Point());}//计算轮廓的面积for(inti=0;i<(int)contours.size();i++){g_dConArea=contourArea(contours[i],false);cout<<"【第"<<i<<"个红色轮廓的面积为:】"<<g_dConArea<<endl;} if(g_dConArea>10000) { string1="Red"; cout<<string1<<endl; } //提取蓝色(8位图)
inRange(srcImage,Scalar(200,20,0),Scalar(255,80,20),imgThreshold); //开操作(去除一些噪点)morphologyEx(imgThreshold,imgThreshold,MORPH_OPEN,element);//闭操作(连接一些连通域)
morphologyEx(imgThreshold,imgThreshold,MORPH_CLOSE,element);blur(imgThreshold,imgThreshold,Size(3,3));//用Canny算子检测边缘
Canny(imgThreshold,canny_output,3,9,3);//寻找轮廓
findContours(canny_output,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//绘出轮廓
for(inti=0;i<contours.size();i++){Scalarcolor=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));drawContours(drawing,contours,i,color,3,8,hierarchy,0,Point());}//计算轮廓的面积y12.3用Opencv完成图像处理26第十二章基于OpenCV的视觉分拣for(inti=0;i<(int)contours.size();i++){g_dConArea=contourArea(contours[i],false);cout<<"【第"<<i<<"个蓝色轮廓的面积为:】"<<g_dConArea<<endl;} if(g_dConArea>10000) { string1="Blue"; cout<<string1<<endl; } //提取黑色(8位图)
inRange(srcImage,Scalar(40,40,5),Scalar(100,100,70),imgThreshold); //开操作(去除一些噪点) morphologyEx(imgThreshold,imgThreshold,MORPH_OPEN,element);//闭操作(连接一些连通域)
morphologyEx(imgThreshold,imgThreshold,MORPH_CLOSE,element);blur(imgThreshold,imgThreshold,Size(3,3));//用Canny算子检测边缘
Canny(imgThreshold,canny_output,3,9,3);//寻找轮廓
findContours(canny_output,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//绘出轮廓
for(inti=0;i<contours.size();i++){Scalarcolor=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));drawContours(drawing,contours,i,color,3,8,hierarchy,0,Point());}//计算轮廓的面积for(inti=0;i<(int)contours.size();i++){g_dConArea=contourArea(contours[i],false);cout<<"【第"<<i<<"个黑色轮廓的面积为:】"<<g_dConArea<<endl;}12.3用Opencv完成图像处理27第十二章基于OpenCV的视觉分拣if(g_dConArea>10000) { string1="Black"; cout<<string1<<endl; }//在窗体中显示结果
namedWindow("【结果图】",CV_WINDOW_AUTOSIZE);imshow("【结果图】",drawing); charkey=(char)waitKey(300);if(key==27) break;}}
效果如图12-23至12-25所示:图12-23基于OPencv的图像处理图12-24基于OPencv的图像处理28第十二章基于OpenCV的视觉分拣图12-25基于OPencv的图像处理12.4完成通讯29第十二章基于OpenCV的视觉分拣#include<WinSock2.h>#include<stdio.h>#include<stdlib.h>#pragmacomment(lib,"ws2_32.lib")voidmain(){ WSADATAwsaData;//用于存放socket初始化信息
intport=8080; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("FailedtoloadWinsock");//返回值不等于0,说明初始化失败
return; } //创建用于监听的套接字
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//生成TCP套接字sockSrv SOCKADDR_INaddrSrv;
//TCP/IP协议
addrSrv.sin_family=AF_INET;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 硅烷法多晶硅制取工岗前风险评估考核试卷含答案
- 铁路机车装调工安全生产意识模拟考核试卷含答案
- 汽车车身涂装修复工岗后模拟考核试卷含答案
- 金属版印刷员测试验证竞赛考核试卷含答案
- 遗体防腐整容师岗前安全专项考核试卷含答案
- 膜剂工安全检查竞赛考核试卷含答案
- 肥料配方师岗前技能综合实践考核试卷含答案
- 经编机操作工岗中核心能力考核试卷含答案
- 塑料家具制作工保密测试考核试卷含答案
- 蒸馏炉工安全教育强化考核试卷含答案
- 2026道德与法治九年级上册说课逐字稿:坚强领导的核心
- 远离毒品小学主题班会课件
- 2026年辅警考试公安基础知识考试试题库及参考答案
- 2026 银行审计稽核管理岗招聘考试参考题库 含答案
- (2026版)《河北省预防未成年人犯罪条例》解读
- 库内货物堆码安全标准
- 配电网运行规程
- 人教版小学数学五年级上册第六单元《多边形的面积》单元作业设计
- GB/T 14616-2026机舱舱底涂料
- 公司财务管理系统建设方案
- 印章刻制业内部管理制度
评论
0/150
提交评论