图片命名格式转换为00001.jpg 00002.jpg

自己写的一段将读取的图像输出为指定格式的(其实就是slam数据集那样的格式00000.png 00001.png)的图片;
上代码,以便自己以后使用
下面展示一些 内联代码片

/**
 *      @time: 2020.9.23
 *      
 *      @filename: Calib.cpp
 * 
 *      @note: 自己采集的图片,利用文件输入输出流,将文件名格式化为00000 00001
 * 
 *      @camera: 工业相机
 * 
 */

#include <iostream>

// OpenCV
// 其实用不到这么多
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>

// 文件输入输出流
#include <fstream>
#include <sstream>

// boost format格式控制
#include <boost/format.hpp>

// setw() setfill
// 格式化输出
#include <iomanip> 

#include <string.h>


using namespace std;
using namespace cv;

string dataset_path = "/home/xxx/dataset";

void ReadImg(int &index, 
             string &DatasetPath,
             vector<cv::Mat> &dataset);


int main ( int argc, char** argv )
{
    int img_file_index = 0;
    
    vector<cv::Mat> dataset;

    // 读取图像, 将图像传入容器中, 后续从容器中取出,再用指定格式输出图像
    ReadImg(img_file_index, dataset_path, dataset);

    // 输出图片
    string imgfilename;
    std::stringstream StrStm;

    int filecount = 0;
    
    for ( unsigned int i = 0; i < dataset.size(); i++ )
    {
        Mat newimage = dataset[i];
        StrStm.clear(); // 循环,前边写入的会在流里,clear一下
        imgfilename.clear();

        //从右往左  剩下的用0填满   一共填充5位   0 — ....      
        StrStm << setfill('0') << setw(5) << filecount;
        
        filecount++;
        
        StrStm >> imgfilename;

        imgfilename += ".jpg";

        imwrite(imgfilename, newimage);

    }

    return 0;
}


void ReadImg(int &index, 
             string &DatasetPath,
             vector<cv::Mat> &dataset)
{

    while(1)
    {
        // format格式控制 %s路径: "/home/ginger/NCUTDataset/917/3/3"
        boost::format fmt("%s/my_video-3_%03d.jpg"); // my_video-3_000.jpg 000是变化的用%03d代替, 03是说从三个零开始:000 
        

        cv::Mat Lab;

        Lab = cv::imread((fmt % DatasetPath % index).str(), cv::IMREAD_GRAYSCALE);

        // 判定图像是否为空
        if ( Lab.data == 0 )
        {
            cout << " 图像读取完毕! " << endl;
            break;
        }

        dataset.push_back(Lab);

        index++;
    }
    
}

然后这是CMakeLists.txt中的内容

cmake_minimum_required(VERSION 3.0)

project(myCalib)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
# set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "-std=c++11 -O3") 
# CMAKE_CXX_FLAGS_RELEASE 可以让程序在vscode中调试
# CMAKE_CXX_FLAGS_DEBUG 则不行

# 可执行文件输出位置  
# 必须在前边
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# 找到他们:
# opencv
find_package(OpenCV 3.3.0 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

# Eigen
include_directories("/usr/local/include/eigen3")

# Sophus
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})

# 生成可执行文件
# 必须在 target_link_libraries之前
add_executable(myCalib main.cpp)

# 链接
target_link_libraries(myCalib 
					  ${OpenCV_LIBS} 
					  ${Sophus_LIBRARIES} )
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值