Opencv——批量处理同一文件夹下的图片(解决savedfilename = dest + filenames[i].substr(len)问题)
生活随笔
收集整理的這篇文章主要介紹了
Opencv——批量处理同一文件夹下的图片(解决savedfilename = dest + filenames[i].substr(len)问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、完整代碼
- 二、實現效果
前言
第一份代碼實現了批量修改同一文件夾下圖片的尺寸,有其他需求時僅需修改處理部分的代碼以及文件夾路徑。
第二份代碼實現了批量截取同一文件夾下每張圖片的ROI區域作為結果保存,注意截取后按下enter鍵才會跳到下一張圖片,同時若是對已經截取的不滿意只要不按下enter鍵都是可以重新選擇的,這都得益于selectROI函數。
參考了文章:
opencv——批量處理圖片并保存
但是編譯時發現了問題,debug發現是下面一行代碼出了問題。
savedfilename = dest + filenames[i].substr(55);報錯:
[[noreturn]] static void _Xlen()
經過百度,發現代碼中的55意味著path的字符串長度。修改代碼為
int len = path.length(); savedfilename = dest + filenames[i].substr(len);問題解決。
一、完整代碼
代碼1:
#include <opencv2/opencv.hpp> #include "opencv2/features2d.hpp" #include <vector> #include <algorithm> #include <iostream> #include "windows.h" #include <stdio.h> #include <time.h> #include <math.h> #include <fstream> #define WINDOW_NAME "【程序窗口】" using namespace cv; using namespace std; int main() {cv::String path = "D:/opencv_picture_test/視覺項目新/"; //待處理圖片文件夾地址cv::String dest = "D:/opencv_picture_test/視覺項目resize后的圖片夾/測試圖片夾/"; //處理后圖片的保存地址cout << "獲取地址成功"<< endl;cv::String savedfilename;std::vector<cv::String> filenames;int len = path.length();cv::Mat srcImg, dstImg;cv::glob(path, filenames); //opencv里面用來讀取指定路徑下文件名的一個很好用的函數for (int i = 0; i < filenames.size(); i++) {srcImg = cv::imread(filenames[i]);//*************************對圖片的處理部分***************************///這里我們批量修改圖片的大小resize(srcImg, dstImg,Size(600,450));//********************************************************************/savedfilename = dest + filenames[i].substr(len);std::cout << savedfilename << std::endl;cv::imwrite(savedfilename, dstImg);cout << "第" << i << "張完成" << endl;}waitKey(0);return 0; }代碼2:
#include <opencv2/opencv.hpp> #include "opencv2/features2d.hpp" #include <vector> #include <algorithm> #include <iostream> #include "windows.h" #include <stdio.h> #include <time.h> #include <math.h> #include <fstream> #define WINDOW_NAME "【程序窗口】" using namespace cv; using namespace std; int main() {//改變控制臺字體顏色system("color 02");cv::String path = "D:/opencv_picture_test/視覺項目resize后的圖片夾/測試圖片夾/"; //待處理圖片文件夾地址cv::String dest = "D:/opencv_picture_test/視覺項目resize后的圖片夾/模板圖片夾/"; //處理后圖片的保存地址cout << "獲取地址成功" << endl;cv::String savedfilename;std::vector<cv::String> filenames;int len = path.length();cv::Mat srcImg, dstImg;cv::glob(path, filenames); //opencv里面用來讀取指定路徑下文件名的一個很好用的函數for (int i = 0; i < filenames.size(); i++) {srcImg = cv::imread(filenames[i]);//*************************對圖片的處理部分***************************///這里我們批量選擇原圖中的某塊ROI區域作為結果保存Rect2d r;r = selectROI(srcImg, true); //選擇一個矩形roi區域dstImg = srcImg(r); //此區域為模板區域destroyAllWindows();//********************************************************************/savedfilename = dest + filenames[i].substr(len);std::cout << savedfilename << std::endl;cv::imwrite(savedfilename, dstImg);cout << "第" << i << "張完成" << endl;waitKey(30);}return 0; }有些多余的頭文件可以不添加。
二、實現效果
resize后:
截取后的圖:
總結
以上是生活随笔為你收集整理的Opencv——批量处理同一文件夹下的图片(解决savedfilename = dest + filenames[i].substr(len)问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艺术照摄影多少钱啊?
- 下一篇: 面包蟹多少钱一斤啊?