C++中调用usb摄像头并保存图片【学习记录第1篇】

准备

外置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摄像头运行结果

外置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超声波探头运行结果

外置USB超声波探头运行结果

第一篇博客的感想

作为2020年的目标之一,创建一个属于自己的博客,终于在今天实现啦!在记录自己学习过程之余,顺便分享给大家~

自己平时学习的时候,也需要参考很多人的代码,虽然往往都可以搜到很多相关资料,但内容往往都千篇一律,真正有参考价值也少之又少,所以我尽量做到自己博客中的内容是行之有效的!

没想到这个CSDN的Markdown编辑器还挺好用的!

有任何指教请直接留言我~或者 zhoujiayi1017@gmail.com

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值