一、两个重要函数
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,然后使用cv的cvSetData,将这个图像数据块链接到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");
}
参考文献
1.呵呵晚安《OpenCV 获取摄像头,新建窗口显示摄像头视频》