请问如何使用VC++获得从图像采集卡(连着摄像头)得来的图像?
本人是个VC盲,最近需要使用VC++处理来自摄像头的图像,使用图像采集卡带的软件已经可以在电脑上实时显示摄像头拍到的场景,但是不知道怎么使用VC把那些图像拿出来用,如获得...
本人是个VC盲,最近需要使用VC++处理来自摄像头的图像,使用图像采集卡带的软件已经可以在电脑上实时显示摄像头拍到的场景,但是不知道怎么使用VC把那些图像拿出来用,如获得一个类似于二维数组(灰度值等)的东西,然后进行图像处理。请问怎么做?本人是个VC盲。
展开
展开全部
现在在vc上采集视频常用的方法有三:vfw,directshow,opencv
你是要进行图像处理的话推荐opencv(具体参考:于仕琪,opencv教程基础篇中的例3-6,稍作修改,估计就能用于你的工程)
下面贴出我自己编的一个小工程:如有疑问,E-mail:zhoutingzhi@gmail.com
进行opencv的预备操作你要看那本书和逛opencv中文网
http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5
如有问题可以和我讨论(我也是菜鸟,刚为解决了这个问题窃喜不已)。
1.新建mfc对话框工程,在其中添加一个picture控件,除了ID以外什么都不用改
2.在对话框头文件(没有Dlg那个)中添加(最好是在“#include "resource.h" // main symbols之后”):
#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "cv.h"
#include "highgui.h"
3.在工程-》设置-》选择所有配置-》link(连接)-》对象/库模块-》中添加:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
4.在需要触发摄像头显示的地方添加:
void CVideomfcDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin=::GetDlgItem(m_hWnd,IDC_VIDEO); //获得控件句柄(IDC_VIDEO就是图片控件)
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
int width=240;
int height=240;
cvcamSetProperty(0,CVCAM_PROP_WINDOW, &MyWin); // Selects a window for
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback1);
//回调函数将处理每一帧
cvcamInit( );
cvcamStart( );
}
5.改变显示的图像序列大小,在窗口属性设定了以后,添加如下代码:
int width=320; //这个就是需要显示的窗口大小
int height=240; //根据自己需要选择
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
6.在对话框类中添加callback成员函数(注意,在添加函数的时候,一定要选择static,不选的话你就自己郁闷去吧,反正我是为了这个郁闷了2个礼拜)
void CVideomfcDlg::callback1(IplImage *image)
{
IplImage* image1 = image;
int i,j;
assert (image);
//获取当前系统时间
SYSTEMTIME st2={0};
GetLocalTime(&st2);
char sss[18]={'C',':','\\','\\','1','\\','\\','1','1','1','1','1','1','.','j','p','g'}; //这个是用来存储所要保存的图片名的,用的是一个笨办法,先定义,再修改其中的数组值。
sss[7]=st2.wHour/10+48; //获取系统当前小时
sss[8]=st2.wHour%10+48;
sss[9]=st2.wMinute/10+48; //获取系统当前分钟
sss[10]=st2.wMinute%10+48;
sss[11]=st2.wSecond/10+48; //获取系统当前秒
sss[12]=st2.wSecond%10+48;
cvSaveImage(sss,image1); //使用系统当前时间为名称(XXXXXX.jpg)存储图片
}
ps:你还需要在c盘根目录下建立一个叫1的文件夹保存图片。
祝你成功!
你是要进行图像处理的话推荐opencv(具体参考:于仕琪,opencv教程基础篇中的例3-6,稍作修改,估计就能用于你的工程)
下面贴出我自己编的一个小工程:如有疑问,E-mail:zhoutingzhi@gmail.com
进行opencv的预备操作你要看那本书和逛opencv中文网
http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5
如有问题可以和我讨论(我也是菜鸟,刚为解决了这个问题窃喜不已)。
1.新建mfc对话框工程,在其中添加一个picture控件,除了ID以外什么都不用改
2.在对话框头文件(没有Dlg那个)中添加(最好是在“#include "resource.h" // main symbols之后”):
#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "cv.h"
#include "highgui.h"
3.在工程-》设置-》选择所有配置-》link(连接)-》对象/库模块-》中添加:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
4.在需要触发摄像头显示的地方添加:
void CVideomfcDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin=::GetDlgItem(m_hWnd,IDC_VIDEO); //获得控件句柄(IDC_VIDEO就是图片控件)
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
int width=240;
int height=240;
cvcamSetProperty(0,CVCAM_PROP_WINDOW, &MyWin); // Selects a window for
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback1);
//回调函数将处理每一帧
cvcamInit( );
cvcamStart( );
}
5.改变显示的图像序列大小,在窗口属性设定了以后,添加如下代码:
int width=320; //这个就是需要显示的窗口大小
int height=240; //根据自己需要选择
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
6.在对话框类中添加callback成员函数(注意,在添加函数的时候,一定要选择static,不选的话你就自己郁闷去吧,反正我是为了这个郁闷了2个礼拜)
void CVideomfcDlg::callback1(IplImage *image)
{
IplImage* image1 = image;
int i,j;
assert (image);
//获取当前系统时间
SYSTEMTIME st2={0};
GetLocalTime(&st2);
char sss[18]={'C',':','\\','\\','1','\\','\\','1','1','1','1','1','1','.','j','p','g'}; //这个是用来存储所要保存的图片名的,用的是一个笨办法,先定义,再修改其中的数组值。
sss[7]=st2.wHour/10+48; //获取系统当前小时
sss[8]=st2.wHour%10+48;
sss[9]=st2.wMinute/10+48; //获取系统当前分钟
sss[10]=st2.wMinute%10+48;
sss[11]=st2.wSecond/10+48; //获取系统当前秒
sss[12]=st2.wSecond%10+48;
cvSaveImage(sss,image1); //使用系统当前时间为名称(XXXXXX.jpg)存储图片
}
ps:你还需要在c盘根目录下建立一个叫1的文件夹保存图片。
祝你成功!
展开全部
大家知道,为了提高系统的稳定性,Windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。DirectShow Filter工作在用户模式(User mode,操作系统特权级别为Ring 3),而硬件工作在内核模式(Kernel mode,操作系统特权级别为Ring 0),那么它们之间怎么协同工作呢?
DirectShow解决的方法是,为这些硬件设计包装Filter;这种Filter能够工作在用户模式下,外观、控制方法跟普通Filter一样,而包装Filter内部完成与硬件驱动程序的交互。这样的设计,使得编写DirectShow应用程序的开发人员,从为支持硬件而需做出的特殊处理中解脱出来。
所以说要用到DirectShow
先下载directSDK9.0b,在其安装目录下有大量源码可供参考,但是如果你VC不好的话也就没办法了。
DirectShow解决的方法是,为这些硬件设计包装Filter;这种Filter能够工作在用户模式下,外观、控制方法跟普通Filter一样,而包装Filter内部完成与硬件驱动程序的交互。这样的设计,使得编写DirectShow应用程序的开发人员,从为支持硬件而需做出的特殊处理中解脱出来。
所以说要用到DirectShow
先下载directSDK9.0b,在其安装目录下有大量源码可供参考,但是如果你VC不好的话也就没办法了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用DirectShow
具体参见网页:http://www.west263.com/info/html/chengxusheji/C-C--/20080410/60853.html
具体参见网页:http://www.west263.com/info/html/chengxusheji/C-C--/20080410/60853.html
参考资料: http://www.west263.com/info/html/chengxusheji/C-C--/20080410/60853.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果他的软件没有保存录像功能或者截图功能,你只能自己去找这个型号板卡的开发接口,也就是通常说的板卡api,这个是很麻烦的,如果不是公司研发需要没人干这个事情。如果有截图或者录像功能的话,通常都是压缩过的格式,现在的标准是h.264,你应该找相应的解压缩软件,或者自己找算法自己写(这个也比较难,你最好有研究生学历并且精通工程数学),转化成标准图像格式也就是bmp格式然后再处理。以楼主现在的水平来看,如果想驱动板卡同时对图像进行处理有一定的难度,最好另辟蹊径。有问题可以继续问我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
找本图像处理的书看看,有些还带源代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询