基于opencv的use摄像头视频采集程序

 1 E币 
成为会员,免费下载资料
文件大小:1.57 MB 上传者:kenneth197 时间:2016-06-21 20:36:59 下载量:27

PS: 这是找到一份文件中的,分享出来 ,文件中并未给出出处,doc文件见附件
准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。
建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码:
#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "highgui.h"
void callback(IplImage* image);
int main()
{
int ncams=cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin;
    // 设置系统属性
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头   
//camera
    cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE); //We'll render stream
    // 在本例中
    // 假设创建一个窗口,并且窗口的ID是在变量 MyWin 中定义
    // MyWin 是窗口 HWND 的类型
    MyWin=(HWND)cvGetWindowHandle("CameraUSB window");   
    cvcamSetProperty(0,CVCAM_PROP_WINDOW,&MyWin);   // Selects a window for
    //video rendering
//回调函数将处理每一帧
cvcamSetProperty(0,CVCAM_PROP_CALLBACK,callback);
     cvcamInit( );
    cvcamStart( );
    // 现在程序开始工作
    cvWaitKey(0);
    cvcamStop( );
    cvcamExit( );
    return 0;
}
// 在图像中画兰色水平线
void callback(IplImage* image)
{
    IplImage* image1 = image;
    int i,j;
   
    assert (image);
   
    for(i=0; iheight; i+=10)
    {
        for(j=(image1->widthStep)*i; j<(image1->widthStep)*(i+1);
        j+=image1->nChannels)
        {
            image1->imageData[j]   = (char)255;
            image1->imageData[j+1] = 0;
            image1->imageData[j+2] = 0;
        }
     }
}

[code]实现功能:同时采集两路USB摄像头数据,并显示,具有图片保存功能(点击左键保存图片,并暂停视频;右键继续视频)。步骤就不说了,很简单,直接放代码了:
#include
#include
#include
#include "stdio.h"
#include
void StereoCallback(IplImage *frame1,IplImage *frame2);
void onMouse1(int Event,int x,int y,int flags,void *param);
void onMouse2(int Event,int x,int y,int flags,void *param);
IplImage *image1,*image2;
char *strleft[4]={"left1.bmp","left2.bmp","left3.bmp","left4.bmp"};
char *strright[4]={"right1.bmp","right2.bmp","right3.bmp","right4.bmp"};
void main()
{
    HWND CaptureWindow1=0; //不赋值也行
    HWND CaptureWindow2=0;
//int ncams=cvcamGetCamerasCount(); //获取摄像头的个数,在这里可有可无
//用对话框的形式来选取摄像头
    int *CameraNumber;
    int nSelected = cvcamSelectCamera(&CameraNumber);
/* //灰色图像
image1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);
image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);
*/
//彩色图像
image1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);
image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);
//初始化两个摄像头
   cvNamedWindow("cvcam1 Window",1);
        CaptureWindow1=(HWND)cvGetWindowHandle("cvcam1 Window");
        cvcamSetProperty(CameraNumber[0], CVCAM_PROP_ENABLE, CVCAMTRUE);
        cvcamSetProperty(CameraNumber[0], CVCAM_PROP_RENDER, CVCAMTRUE);
        cvcamSetProperty(CameraNumber[0], CVCAM_PROP_WINDOW, &CaptureWindow1);
// cvSetMouseCallback("cvcam1 Window",onMouse1,0);

        cvNamedWindow("cvcam2 Window",1);
        CaptureWindow2=(HWND)cvGetWindowHandle("cvcam2 Window");
        cvcamSetProperty(CameraNumber[1], CVCAM_PROP_ENABLE, CVCAMTRUE);
        cvcamSetProperty(CameraNumber[1], CVCAM_PROP_RENDER, CVCAMTRUE);
        cvcamSetProperty(CameraNumber[1], CVCAM_PROP_WINDOW, &CaptureWindow2);
// cvSetMouseCallback("cvcam2 Window",onMouse2,0);
//让两个摄像头同步
   cvcamSetProperty(CameraNumber[0],CVCAM_STEREO_CALLBACK,(void*)&StereoCallback);
//启动程序
    cvcamInit();
    cvcamStart();
cvSetMouseCallback("cvcam1 Window",onMouse1,0);
cvSetMouseCallback("cvcam2 Window",onMouse2,0);
    cvWaitKey(0);
    cvcamStop();
free(CameraNumber);
cvcamExit();
    cvDestroyWindow("cvcam1 Window");
    cvDestroyWindow("cvcam2 Window");
}
void StereoCallback(IplImage* frame1,IplImage *frame2)
{
/*   //把图像转换成灰度图并保存到image中
cvCvtColor(frame1,image1,CV_RGB2GRAY);
cvCvtColor(frame2,image2,CV_RGB2GRAY);
*/
//拷贝图像到全局变量image中 该函数这样用存在问题
// cvCopy(frame1,image1);
// cvCopy(frame2,image2);
image1=cvCloneImage(frame1);
image2=cvCloneImage(frame2);
//对截取的图像翻转
cvFlip(image1,image1,0);
cvFlip(image2,image2,0);
}
void onMouse1(int Event,int x,int y,int flags,void *param)
{

static int num=0;
   if(Event==CV_EVENT_LBUTTONDOWN)
   {
   if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原
    cvcamPause();
    //图像保存
   cvSaveImage(strleft[num],image1);
// cvSaveImage(strright[num],image2);
   // cvSaveImage("left.bmp",image1);
   // cvSaveImage("right.bmp",image2);
   }
   if(Event==CV_EVENT_RBUTTONDOWN)
   {
    cvcamResume();
    num++;
   }
  
}
void onMouse2(int Event,int x,int y,int flags,void *param)
{

static int num=0;
   if(Event==CV_EVENT_LBUTTONDOWN)
   {
   if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原
    cvcamPause();
    //图像保存
//   cvSaveImage(strleft[num],image1);
   cvSaveImage(strright[num],image2);
   // cvSaveImage("left.bmp",image1);
   // cvSaveImage("right.bmp",image2);
   }
   if(Event==CV_EVENT_RBUTTONDOWN)
   {
    cvcamResume();
    num++;
   }
  
}
[/code]
展开
折叠
1061
评论
共 0 个
内容存在敏感词
    易百纳技术社区暂无数据
相关资料
关于作者
易百纳技术社区
kenneth197
贡献资料 17
易百纳技术社区 我上传的资料
登录查看
我赚取的积分
登录查看
我赚取的收益
登录查看
上传资料 赚取积分兑换E币
易百纳技术社区
删除原因
广告/SPAM
恶意灌水
违规内容
文不对题
重复发帖
置顶时间设置
结束时间
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-资料模块

审核失败

失败原因
备注
易百纳技术社区