OpenCV——启动摄像头

一、两个重要函数

1.cvCreateCameraCapture

初始化从摄像头中获取视频

CvCapture* cvCreateCameraCapture( int index );

index 

要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。

函数cvCreateCameraCapture给从摄像头的视频流分配和初始CvCapture结构。目前在Windows下可使用两种接口:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。

释放这个结构,使用函数cvReleaseCapture。

2.cvQueryFrame函数

从摄像头或者文件中抓取并返回一帧

IplImage* cvQueryFrame( CvCapture* capture );

函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。 抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。

二、代码示例

#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#include
        
        
          using namespace cv; //从摄像头中读入数据 int main(int argc, char** argv) { cvNamedWindow("camera", CV_WINDOW_AUTOSIZE); //CvCapture* capture = cvCreateFileCapture("视频文件路径"); //读取视频文件 CvCapture* capture = cvCreateCameraCapture(0);//如果参数为0,则从摄像头中读入数据,并返回一个CvCapture的指针 //assert(capture != NULL); //断言(assert)使用,检查capture是否为空指针,为假时程序退出,并打印错误消息 IplImage* frame = NULL; Sleep(10000); while (1) { frame = cvQueryFrame(capture);//用于将下一帧视频文件载入内存(实际是填充和更新CvCapture结构中),返回一个对应当前帧的指针 if (!frame) break; cvShowImage("camera", frame);//在这里更改弹出的窗口名称 //CTime time; //time = CTime::GetCurrentTime(); //CStringA filename(time.Format(CString("%Y%m%d%H%M%S")) + ".jpg");//在这里更改图片名称 //cvSaveImage("f:\\camera\\" + filename, frame);//在这里更改图片的保存位置 char c = cvWaitKey(33);//在这里调节帧率,当前为1000/33帧每秒 if (c == 27) break; //ESC键退出循环,读入数据停止 } cvReleaseCapture(&capture);//释放内存 cvDestroyWindow("camera"); } 
        
       
       
      
      
     
     
    
    

三、工业摄像头问题

1.摄像头种类:网口  wifi  usb  采集卡 
2.大恒Manta系列:
1)首先,安装摄像头驱动,这是大家都免不了的事情
2)然后,你的软件要加载SDK给你的DLL,一般会附带在SDK的相关目录中;
3)使用这个厂家给的DLL,调用拍摄函数,能获取到一个图像数据块,一般用GetRGBImage这类名称;

4)cv中创建一个cvImageHead,然后使用cvcvSetData,将这个图像数据块链接到cvImageHead,就可以像普通的cv图像对象一样操作了。

///Project:调用dll
///Author:JA
///Date:2015-2-2



#include 
      
      
       
       
#include 
       
       
        
         

typedef int(__cdecl *MYPROC)(LPWSTR);

VOID main(VOID)
{
	HINSTANCE hinstLib;
	MYPROC ProcAdd;
	BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

	// Get a handle to the DLL module.

	hinstLib = LoadLibrary(TEXT("mydll"));  // mydll是dll的文件名

	// If the handle is valid, try to get the function address.

	if (hinstLib != NULL)
	{
		ProcAdd = (MYPROC)GetProcAddress(hinstLib, "myPuts");  // myfun是dll中,你想调用的函数名

		// If the function address is valid, call the function.

		if (NULL != ProcAdd)
		{
			fRunTimeLinkSuccess = TRUE;
			(ProcAdd)(L"Message sent to the DLL function\n");
		}

		// Free the DLL module.

		fFreeResult = FreeLibrary(hinstLib);
	}

	// If unable to call the DLL function, use an alternative.

	if (!fRunTimeLinkSuccess)
		printf("Message printed from executable\n");
}

       
       
      
      



参考文献


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PaQiuQiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值