c++批量读取图片并处理

这篇博客展示了如何使用C++进行文件操作,包括获取文件名、后缀和批量读取图片。通过OpenCV库,实现了批量读取图片,处理图像数据,并将图片合成视频。此外,还涉及了文件路径处理和文件查找函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>  
#include <string> 
using namespace std;
void main()
{
	string path = "C:/Visual Studio 2019/Projects/VOC2007_makevideo/000001.txt";
	
	//1.获取不带路径的文件名
	string::size_type iPos = path.find_last_of('/') + 1;
	string filename = path.substr(iPos, path.length() - iPos);
	cout << filename << endl;
 
	//2.获取不带后缀的文件名
	string name = filename.substr(0, filename.rfind("."));
	cout << name << endl;
 
	//3.获取后缀名
	string suffix_str = filename.substr(filename.find_last_of('.') + 1);//获取('.')后面的位置到结尾的字符串
	cout << suffix_str << endl;
}

1. s.substr(0,5):获得字符串s中从第0位开始,长度为5的字符串;默认时的长度为从开始位置到尾。

2. find_first_of(): 在字符串中查找第一个出现的字符c;

    int find_first_of(char c, int start = 0)
    查找字符串中第1个出现的c,由位置start开始。
    如果有匹配,则返回匹配位置;否则,返回-1.

    默认情况下,start为0,函数搜索整个字符串。

3. find_last_of():在字符串中查找最后一个出现的字符c;
    int find_last_of(char c):
    查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1.
    该搜索在字符末尾查找匹配,所以没有提供起始位置。

4. find()正向查找,rfind()反向查找

一、批量读取文件夹下的图片和txt文档并处理

#include <iostream>
#include <sstream>

#include <vector>
#include <string>
#include "ImageProcess.h"
#include <stdio.h>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>

void main()
{
    std::string imgdir = "C:\\Visual Studio 2019\\Projects\\VOC2007";
    //创建一个String类型 名字为image_files的vector
    string pattern_img = imgdir + "\\img\\*.jpg";
    vector<string> image_files;
    cv::glob(pattern_img, image_files);//把pattern_img路径下所有文件名存在image_files中
    
    for (int i = 0; i < image_files.size(); ++i) {
        
        string::size_type iPos = image_files[i].find_last_of('\\') + 1;
        string filename = image_files[i].substr(iPos, image_files[i].length() - iPos);
        std::cout << filename << std::endl;

        //2.获取不带后缀的文件名
        string name = filename.substr(0, filename.rfind("."));
        std::cout << "无后缀:"<< name << std::endl;
        cv::Mat img = cv::imread(image_files[i]);//000053_testimg.png
        
        vector<vector<double>> data;
        txt_to_vectordouble(data, imgdir + "\\labels\\" + name + ".txt");
        std::cout << "txtdir: " << imgdir + "\\labels\\" + name + ".txt" << std::endl;
        CImgProcess w;
        w.ImgProcess_second(img, data);
        string write_name = imgdir + "\\results\\" + name + ".jpg";
        std::cout <<"write_name: " << write_name << std::endl;
        cv::imwrite(write_name, img);
    }

二、批量保存图片

    int k = 1;
    char writename[40];
    sprintf(writename, "%s%d%s", "./data/output/qr", k, ".jpg");//sprintf将数据格式化写入字符串writename中
    imwrite(writename, colorImage);

三、将文件夹的图片合成视频

/*************************将保存的图片合成为视频**********************************/
    string pattern_img = imgdir + "\\results\\*.jpg";
    vector<string> image_files;
    cv::glob(pattern_img, image_files);//把pattern_img路径下所有文件名存在image_files中
    
    int isColor = 1;
    //每秒钟的帧率,即一秒放多少帧图片  
    int fps = 2;
    //获取图片的宽和高  
    int frameWidth = 640;
    int frameHeight = 480;
    //声明VideoWriter类,写入视频  
    cv::VideoWriter writer;

/*cv::VideoWriter::fourcc('M', 'P', '4', 'V')生成MP4格式视频*/

/*cv::VideoWriter::fourcc('M', 'J', 'P', 'G')生成avi格式视频,大小比'X', 'V', 'I', 'D'大*/ /*cv::VideoWriter::fourcc('X', 'V', 'I', 'D')生成avi格式视频*/
    writer.open("D:\\test.mp4", writer.fourcc('m', 'p', '4', 'v'), fps, cv::Size(frameWidth, frameHeight));

    for (int i = 0; i < image_files.size(); ++i) {
        cv::Mat img = cv::imread(image_files[i]);//000053_testimg.png
        if (img.empty())
        {
            break;
        }
        //cv::imshow("src", img);
        //cv::waitKey(30);
        //调用writer类,传入图片  
        writer.write(img);
    }
    
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值