基于OpenCV,简单的使用Point Grey的SDK在MFC上打开单个或多个Point Grey相机

原创 2015年07月08日 22:23:09

尝试打开的相机型号两种,一种是映美精的DMK41BF02(USB),另一种是灰点的GS3-U3-28S4M-C(USB)。

PC系统W7x64,VS2008,OPENCV2.3.1

参考kevinhughes27点击打开链接打开单目灰点的方法。

单开单目灰点相机

<span style="white-space:pre">		</span> Error error;
		 Camera camera;
		 // Get the image
		 error=camera.Connect(NULL);//灰点的库函数调用,检测相机
		 error=camera.StartCapture();//开启相机
		 char key = 0;
		 int i=0;
		 while(1)
		 {
			 Image rawImage;
			 error = camera.RetrieveBuffer( &rawImage );//捕获帧

			 if (error!=PGRERROR_OK)
			 {
				 AfxMessageBox("Capture error!");捕获失败弹出错误
				 continue;
			 }
			 // convert to rgb Kevin的例子,图像格式转换
			 Image rgbImage;
			 rawImage.Convert( FlyCapture2::PIXEL_FORMAT_BGR, &rgbImage );

			 // convert to OpenCV Mat
			 unsigned int rowBytes = (double)rgbImage.GetReceivedDataSize()/(double)rgbImage.GetRows();       

			 cv::Mat image = cv::Mat(rgbImage.GetRows(), rgbImage.GetCols(), CV_8UC3, rgbImage.GetData(),rowBytes);

			 //cv::imshow("image", image);

			IplImage *pImg=cvLoadImage("Lre.bmp");//在MFC中定义了一个显示控件,m_picture为控件的成员变量

			*pImg=IplImage(image);
			CDC* pDC = m_picture.GetWindowDC(); 
			CvvImage limg;
			CRect rect;
			m_picture.GetClientRect(&rect);
			limg.CopyOf(pImg);
			limg.DrawToHDC(pDC -> m_hDC,&rect);


			 key = cv::waitKey(30); 
		 }
		 if (error!=PGRERROR_OK)
		 {
		 }
		 camera.Disconnect();


打开结果如上图。

打开双目的代码如下

		 Error error;
		 BusManager busMgr;
		 unsigned int numCameras=0;
		error=busMgr.GetNumOfCameras(&numCameras);//检测相机个数
		 if (error!=PGRERROR_OK)
		 {
			 AfxMessageBox("Insufficient number of cameras");
		 }
		 Camera** ppCameras = new Camera*[numCameras];
		 // Connect to all detected cameras and attempt to set them to
		 // a common video mode and frame rate
		 for (unsigned int i = 0; i < numCameras; i++)
		 {
			 ppCameras[i] = new Camera();
			 PGRGuid guid;
			 error = busMgr.GetCameraFromIndex( i, &guid );//获取每个相机的唯一ID
			 // Connect to a camera
			 error = ppCameras[i]->Connect( &guid );//连接相机
			 if (error != PGRERROR_OK)
			 {
				AfxMessageBox("GUID=NO!");
			 }
			 // Set all cameras to a specific mode and frame rate so they
			 // can be synchronized
			 CameraInfo camInfo;
			 error = ppCameras[i]->GetCameraInfo( &camInfo );//获取相机的基本信息,可以忽略
			 if (error != PGRERROR_OK)
			 {
				 AfxMessageBox("INFORMATION ERROR");
			 }
		
			// error = ppCameras[i]->SetVideoModeAndFrameRate( VIDEOMODE_1600x1200Y8,FRAMERATE_15 );
			//if (error!=PGRERROR_OK)
			// {
			//	 AfxMessageBox("MODEL error!");
			// }
		}
		 //Camera cameras;
		 //error = cameras.StartSyncCapture( numCameras, (const Camera**)ppCameras,NULL,NULL );//works for FireWire cameras,not work for USB cameras
		 error=ppCameras[0]->StartCapture();//开始拍照
		 error=ppCameras[1]->StartCapture();
		 if (error!=PGRERROR_OK)
			{
				AfxMessageBox("Startcapture error!");
			}
		 char key = 0;
		 int i=0;
		 while(1)
		 {
			 //Image rawImage;
			 Image image0,image1;
			error=ppCameras[0]->RetrieveBuffer( &image0 );//获取下一帧图像
			error=ppCameras[1]->RetrieveBuffer( &image1 );
			if (error!=PGRERROR_OK)
			{
				AfxMessageBox("RetrieveBuffer error!");
			}
			 // convert to rgb
			 Image rgbImage0,rgbImage1;
			 //BMPOption option;//指定存储的图像
			 image0.Convert( FlyCapture2::PIXEL_FORMAT_BGR, &rgbImage0 );
			 image1.Convert( FlyCapture2::PIXEL_FORMAT_BGR, &rgbImage1 );
			 // convert to OpenCV Mat对图像进行压缩,转换成CV矩阵
			 unsigned int rowBytes0 = (double)rgbImage0.GetReceivedDataSize()/(double)rgbImage0.GetRows();    
			 cv::Mat imageR = cv::Mat(rgbImage0.GetRows(), rgbImage0.GetCols(), CV_8UC3, rgbImage0.GetData(),rowBytes0);
			 unsigned int rowBytes1 = (double)rgbImage1.GetReceivedDataSize()/(double)rgbImage1.GetRows();     
			 cv::Mat imageL = cv::Mat(rgbImage1.GetRows(), rgbImage1.GetCols(), CV_8UC3, rgbImage1.GetData(),rowBytes1);
			 //cv::imshow("image", imageR);
			 //将cv::Mat转换成IplImage格式
			 IplImage *pImgR=cvCreateImage(cvSize(1600,1200),8,3);//简单的初始化Lre.bmp,工程中任意的一张图像。
			 *pImgR=IplImage(imageR);
			 //MFC图像显示控件
			 CDC* pDC = m_picture2.GetWindowDC(); 
			 CvvImage limg;
			 CRect rect;
			 m_picture2.GetClientRect(&rect);
			 limg.CopyOf(pImgR);
			 limg.DrawToHDC(pDC -> m_hDC,&rect);
			 cvSaveImage("RIGHT.BMP",pImgR);

			 IplImage *pImgL=cvCreateImage(cvSize(1600,1200),8,3);
			 *pImgL=IplImage(imageL);
			 CDC* pDC1 = m_picture.GetWindowDC(); 
			 CvvImage limg1;
			 CRect rect1;
			 m_picture.GetClientRect(&rect1);
			 limg1.CopyOf(pImgL);
			 limg1.DrawToHDC(pDC1 -> m_hDC,&rect1);
			 cvSaveImage("LEFT.BMP",pImgL);
			 key = cv::waitKey(50); 

NOTE:

1、需要到灰点的官网下载(http://www.ptgrey.com)下载适合自己PC的SDK;

2、Directshow,打开灰点相机的方法也可以在其官网找到。这边简要介绍一下,在自己

下载后的SDK中可以解压后,在Flycapture\bin(64  or  x86)中找到上图红色框中的两个文件,用命令提示符运行进行对directshow 进行注册,即可用。如下:


Directshow打开相机需要的几个头文件库,和两个工程文件,使用时两个工程文件包含在自己的工程中,具体方法可以百度。

完成注册以后,也可以打开相机,打开会弹出属性页。

3、Opencv中的  cvCreateCameraCapture();函数网上说可以打开相机,但是尝试了很多次始终只能打开映美精的相机,灰点的死活在属性页弹出后,一点击确定就出BUG,楼主也没有解决,不知道为什么。

MFC调用HALCON实现相机采图和图像显示

一、相机采图 二、图像显示 1、抓取单帧图像 m_Camera.SingleGrab(GetImage()); 2、显示图片 CHalconBase::uShowImageOrSize(GetMy...
  • surui_555
  • surui_555
  • 2015年04月03日 17:24
  • 3435

读取灰点相机图像C++

配置:V2015 Debug x64 1.新建项目Win32控制台应用程序Point_Grey.sln 2.配置库文件 Point_Grey项目-属性-VC++目录-包含目录-添加E:\FlyC...
  • horizons_kong
  • horizons_kong
  • 2016年11月03日 21:39
  • 1695

PointGrey相机的安装配置使用

PointGrey相机使用总结 对于重装系统后的电脑,如果要使用PointGrey相机,需要进行如下步骤: 第一步:安装相机驱动,FlyCapture2; 连接好左右相机。 第二...
  • Yong_Qi2015
  • Yong_Qi2015
  • 2016年10月27日 21:20
  • 1572

PointGrey相机的安装配置使用

PointGrey相机使用总结 对于重装系统后的电脑,如果要使用PointGrey相机,需要进行如下步骤: 第一步:安装相机驱动,FlyCapture2; 连接好左右相机。 第二...
  • Yong_Qi2015
  • Yong_Qi2015
  • 2016年10月27日 21:20
  • 1572

Point Grey Research官方驱动固件软件(Bumblebee相机系列软件)

请勿转载:版权限制   Software:     Download:   FlyCapture v2.5.2.3 Viewer - Windows Description: The Fly...
  • alec1987
  • alec1987
  • 2013年07月19日 09:58
  • 4044

【OpenCV】***映美精相机应用开发

define.h #ifndef CV_H #define CV_H #include #include #include #include #include #include #i...
  • Taily_Duan
  • Taily_Duan
  • 2016年05月05日 09:55
  • 1892

映美精(IMAGINGSOURCE)相机与OPENCV库

硕士期间本人主要研究基于机器视觉多目标在线识别技术,用到的相机为映美精相机,用到的图像处理库为开源的Opencv3,在实际的应用中,如何将该相机的数据流转换成Opencv的Mat类(该类具有自动申请内...
  • CV_shrimp
  • CV_shrimp
  • 2016年07月25日 12:48
  • 1741

映美精黑白相机在linux平台上的使用(一)

看了好多强文,自己也想像别人一样记录下自己所做的一些工作。在此分享给大家,有错误还请指教! 下面是我用映美精相机在树莓派上的一点摸索。其实也叫不上摸索了,就是照着映美精官网上的指导,一步一步调通而...
  • sinat_28036955
  • sinat_28036955
  • 2015年05月08日 17:05
  • 777

Pylon 以实时图像采集讲解PylonCppSDK使用流程

在工业控制当中,用到basler工业相机sdk编程,主要是使用c或者c++,当项目庞大时,又需要良好的用户界面,用C++是不错的选择。 以实例和看过的一些参照讲讲PylonCppSDK使用流程, ...
  • qq_22511953
  • qq_22511953
  • 2015年05月15日 13:04
  • 3706

Basler工业相机基于opencv 采集图像

本实验在两个博客的基础上实现的,首先是配置opencv   http://blog.csdn.net/lili2425960/article/details/54234299 先前查了一些关...
  • xjgao75
  • xjgao75
  • 2017年02月10日 11:52
  • 1251
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于OpenCV,简单的使用Point Grey的SDK在MFC上打开单个或多个Point Grey相机
举报原因:
原因补充:

(最多只允许输入30个字)