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

it2026-01-08  7

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

准备外置USB摄像头代码外置USB摄像头运行结果外置USB超声波探头代码外置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年的目标之一,创建一个属于自己的博客,终于在今天实现啦!在记录自己学习过程之余,顺便分享给大家~

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

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

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

最新回复(0)