本人初次接触OpenCV,被网上的各种配置和博客搞的很昏头,再自己各种捣腾和摸索后总结一点小小的经验给网友们分享一下。
关于OpenCV的一些小知识:
学习OpenCV的书籍如下推荐:
关于OpenCV版本问题:
#include
#include
#include
#include
#include
由于我在跑网上早起版本OpenCV源码都跑不通,调用的摄像头都是白乎乎的没有任何图像,所以我放弃了OpenCV1.0中的C语言封装,使用基于类的调用的OpenCV2.0及以上版本的类的方法。废话不多说了,下面开始说明如何用OpenCV调用USB摄像头!
废话不多说先撸代码为敬!
(本人用的vs2013+opencv3.0如何配置请看VS2013+OpenCV3.0)
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
char c;
int imgNum = 0;
cv::VideoCapture inputVideo,inputVideo_1; // 这里初始化了两个摄像头,以下的操作只对一个进行
inputVideo.open(0); // 打开第一个摄像头
inputVideo_1.open(1); // 打开第二个摄像头
int width = inputVideo.get(CAP_PROP_FRAME_WIDTH); // 获取合适的分辨率
int height = inputVideo.get(CAP_PROP_FRAME_HEIGHT); // cv默认为640x480
int rate = inputVideo.get(CAP_PROP_FPS); // 获取合适的帧率
inputVideo.set(CAP_PROP_FRAME_WIDTH, 1400); // 设置分辨率
inputVideo.set(CAP_PROP_FRAME_HEIGHT, 1200); // Camera支持的分辨率中随便设置
inputVideo.set(CAP_PROP_FPS, 30); // 设置帧率
if (!inputVideo.isOpened())
{
return -1;
}
Mat src; // 用来储存视频流
Mat frame;// 用来储存一帧
stringstream ss; // 用来存储filename
string str = ".png"; // 或者用.jpg .bmp都可以
string str1 = "./"; //可以自行更改路径
for (;;)
{
inputVideo >> src;
namedWindow("input", WINDOW_AUTOSIZE); //申明窗口名称
imshow("input", src);
c = waitKey(10); // 检测按键
if (c == 27) break; // 按下Esc退出
else if (c == 13) // 按下Enter拍照
{
imgNum++;
ss.str(""); // 清空string
ss << "cap_" << imgNum << str; // 拼接filename,没拍照一次下标加一
inputVideo.read(frame); // 获取一帧照片
cv::imshow("captured image", frame); // 显示
cv::imwrite(str1 + ss.str(), frame); // 写出到文件
}
}
return 0;
}
在配置成功的情况下该代码是可以直接run的,报错的话就在百度上一个一个搜,总能debug出来的,博主初学也是这个一步一步走过来的。
该代码比较简单,关键来说只用了一个VideoCapture类,该类可以读取摄像头视频流和文件视频流,具体可参考官网的document,这里不作过多解释了。
这里贴出运行的结果,直接运行程序得到两个窗口(本人用的鱼眼相机),和按下回车保存为文件的图像
这里要感慨一下,MATLAB真的太强大了,对于搞工程的人来说真的太方便了。前段时间接触了Calibration的东西,最著名的是张正友标定法,旧版本的MATLAB还需要去官网下Calibration Toolbox ,现在发现比较新版本的MATLAB已经把Calibration集成了,只需要执行cameraCalibrator就可以打开标定界面。真的是思思思阔一。。
++++++++++++++++++++++++++++++++++++++++++++++++
1。使用 imaqhwinfo获取摄像头信息
>> info = imaqhwinfo
info =
InstalledAdaptors: {'winvideo'}
MATLABVersion: '8.6 (R2015b)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '4.10 (R2015b)'
2。进一步查看camera的具体参数
>> win_info = imaqhwinfo('winvideo')
win_info =
AdaptorDllName: 'C:\MATLAB\SupportPackages\R2015b\osgenericvideoi…'
AdaptorDllVersion: '4.10 (R2015b)'
AdaptorName: 'winvideo'
DeviceIDs: {[1] [2]} % 设备ID
DeviceInfo: [1x2 struct] % 可以用win_info.DevideInfo查看具体信息
>> win_info.DeviceInfo(1)
ans =
DefaultFormat: 'MJPG_1024x768'
DeviceFileSupported: 0
DeviceName: 'HD USB Camera'
DeviceID: 1
VideoInputConstructor: 'videoinput('winvideo', 1)'
VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)'
SupportedFormats: {1x18 cell}
如果要查看其他信息,可以 . 进去查看,这里就不演示了
3。 创建视频输入
obj = videoinput(adaptorname, deviceID, format)
adaptorname:适配器名称,首次可以使用不带参数的imaqhwinfo函数获取
deviceID:设备ID号,首次可以通过imaqhwinfo函数获取
format:视频采集格式,可以通过DeviceInfo的SupportedFormats获取,不填写则使用默认格式
>> inputCamera = videoinput('winvideo',1,'MJPG_1024x768')
Summary of Video Input Object Using 'HD USB Camera'.
Acquisition Source(s): input1 is available.
Acquisition Parameters: 'input1' is the current selected source.
10 frames per trigger using the selected source.
'MJPG_1024x768' video data to be logged upon START.
Grabbing first of every 1 frame(s).
Log data to 'memory' on trigger.
Trigger Parameters: 1 'immediate' trigger(s) on START.
Status: Waiting for START.
0 frames acquired since starting.
0 frames available for GETDATA.
4。打开视频显示窗口
himage=preview(obj, himage)
obj:视频采集对象
himage:视频预览窗口对应的句柄,也就是说在指定的句柄对象中预览视频,该参数可以空缺
至于预览窗口的关闭和停止可以使用colsepreview和stoppreview函数
>> preview(inputCamera)
5。摄像头捕捉,显示与保存
>> frame = getsnapshot(inputCamera);
>> imshow(frame);
>> imwrite(frame,'capture.jpg');
至此,读取USB摄像头视频流与获取图像并保存的两种方法已经全部介绍完了, 一些微小的工作,希望能帮助大家!