自己写的一段将读取的图像输出为指定格式的(其实就是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} )