【学习记录第1篇】C++中通过OPENCV调用usb摄像头并保存图片
准备
外置USB摄像头型号:LifeCam Studio
Visual Studio 2017
OpenCV版本:3.4.1
(关于OpenCV的环境配置参考文章有很多,这里就不多赘述啦!)
因为自己学习内容的关系,比起摄像头更多使用的超声波探头。
所以为了记录自己的学习过程,文章的后半段会放上调用超声波探头拍摄并保存的代码和结果图。
外置USB摄像头代码
非常简单直接上代码!
//添加头文件
#include<opencv2/core/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
#include<iomanip>
#include<fstream>
#include<chrono>
#include<string>
using namespace std;
using namespace cv;
int main()
{
//打开一个默认的相机
VideoCapture capture(0);
//检查是否成功打开
if (!capture.isOpened())
return -1;
//设置摄像头的分辨率
capture.set(CV_CAP_PROP_FRAME_WIDTH, 720);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
//摄像头帧数
capture.set(CV_CAP_PROP_FPS, 15);
//打印摄像头参数
printf("width = %.2f\n", capture.get(CV_CAP_PROP_FRAME_WIDTH));
printf("height = %.2f\n", capture.get(CV_CAP_PROP_FRAME_HEIGHT));
printf("fbs = %.2f\n", capture.get(CV_CAP_PROP_FPS));
//定义摄像头读取的一帧画面
Mat frame;
chrono::system_clock::time_point start, end;
int max_image = 0;
//计数
int i = 1;
//将图片保存到“test”文件夹中
// !!!“test”文件夹需要事先手动创建,不然图片就无法保存啦!!!!
string DATA = "test";
while (1)
{
capture >> frame;//从相机读取新一帧
//镜像摄像头画面
flip(frame, frame, 1);
//
Mat src = frame;
if (!frame.empty() ){
start = chrono::system_clock::now();
ostringstream oss;
//给保存至文件夹中的图片进行编号
oss << setfill('0') << setw(3) << i;
//将图片保存至文件夹中
imwrite(DATA + "\\pic" + oss.str() + ".png", frame);
imshow("video", src);//显示
waitKey(1);
//当保存500张图片的时候,停止运行
if (i == 500) {
cout << max_image;
break;
}
end = chrono::system_clock::now();
double max_image2 = chrono::duration_cast<chrono::milliseconds>(end - start).count();
max_image = max_image + max_image2;
//计数
i++;
}
}
return 0;
}
代码内容很简单,但需要注意的是图片保存的文件夹需要事情事先手动创建,不然程序就找不到位置保存图片啦!重要的事情说三遍!!!
外置USB摄像头运行结果
外置USB超声波探头代码
现在开始自己的学习过程啦!小伙伴看到这里就可以撤退啦!
#include "stdafx.h"
#include "BankSpd.h"
#include "BankSpdDlg.h"
#include "afxdialogex.h"
#include "CSmc.h"
#include "CSmcdef.h"
#include <mutex>
#include <omp.h>
#include <thread>
#include <mutex>
#include <thread>
#include <exception>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <chrono>
#include "opencv2/opencv.hpp"
#include "opencv2\highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/core.hpp"
#include "opencv2/videoio.hpp"
#include <USBProbe.hpp>
因为创建的是MFC工程文件,不只是调用超声波探头,还有机器人控制,所以头文件有点多啦!
但是重点是 <USBProbe.hpp>这个头文件,需要像OpenCV一样,在工程的附加包含目录和附加库目录中进行环境配置之后,才可以调用!
void CBankSpdDlg::OnBnClickedButton2()
{
//调用USB超声波探头并进行拍摄和保存
std::chrono::system_clock::time_point start, end;
std::chrono::system_clock::time_point start_s, end_e;
//计时用
int elapse_ = 0;
//探头
USBProbe usb_probe;
bool freeze_flg = false;
bool working = true;
//设置显示的超声波画面参数
usb_probe.setConversionParams(220, 750, 60);
usb_probe.disableFreeze();
//将图片保存至“2020default”文件夹中
string DATA = "2020default";
int i = 1;//计数
//---------------------------------------------------图像处理开始
while (working) {
auto src = usb_probe.read();
if (!src.empty()) {
//--------------------------------------------------------开始时间
start = std::chrono::system_clock::now();
//--------------------------------------------------------取得连续的图片并进行保存
ostringstream oss;
oss << std::setfill('0') << std::setw(3) << i;
imwrite(DATA + "\\pic" + oss.str() + ".png", src);
cv::imshow("图像", src);
//--------------------------------------------------------拍摄2000张图片后停止
if (i == 2000)
{
cout << elapse_;
break;
}
end = std::chrono::system_clock::now();
double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
elapse_ = elapse_ + elapsed;
i++;
}
}
因为MFC工程文件,所以开头是【void CBankSpdDlg::OnBnClickedButton2()】的形式。
外置USB超声波探头运行结果
第一篇博客的感想
作为2020年的目标之一,创建一个属于自己的博客,终于在今天实现啦!在记录自己学习过程之余,顺便分享给大家~
自己平时学习的时候,也需要参考很多人的代码,虽然往往都可以搜到很多相关资料,但内容往往都千篇一律,真正有参考价值也少之又少,所以我尽量做到自己博客中的内容是行之有效的!
没想到这个CSDN的Markdown编辑器还挺好用的!
有任何指教请直接留言我~或者 zhoujiayi1017@gmail.com