4020
- 收藏
- 点赞
- 分享
- 举报
基于opencv的use摄像头视频采集程序
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; i
{
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]
文件: OpenCV例程汇总.rar
下载
我来回答
回答2个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2020-10-02 12:44:59
-
2014-10-20 17:05:43
-
2021-03-12 16:08:01
-
2019-11-30 18:38:08
-
2020-09-22 11:37:24
-
2021-01-14 17:36:49
-
2014-09-01 21:59:30
-
2014-09-01 21:57:06
-
2016-09-24 23:35:18
-
2021-01-25 17:34:16
-
72017-07-05 19:07:12
-
02019-07-04 16:21:06
-
62019-01-03 06:57:12
-
2018-02-06 17:53:51
-
2023-08-04 09:15:35
-
2023-06-27 15:00:59
-
2013-11-19 21:42:28
-
2021-01-20 16:23:42
-
12020-08-03 20:16:25
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认