🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3079閲覧

C++ フォルダ内の画像ファイルを順次読み込み

onioni0024

総合スコア14

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/21 09:51

使用環境(VS2015、C++、OpenCV、Windows10 64bit)

お世話になります。
私がやりたいこととしましては、フォルダ内のjpgファイルを順に読み込んでトリミングを行うというものになります。
そこで、ウェブ上の様々な方のコードを参考に書いてはみたのですが、上手く動作してくれません(ビルド自体は通りますがデバック時に例外を投げられます)。
おそらくTrimmingの引数に指定しているポインタのあたりに問題があるのかな、とは思うのですが、いかんせんポインタへの理解が浅いこともあり解決策が分かりません。
どなたかアドバイスを頂ければ幸いです。

C++

1コード 2#define _CRT_SECURE_NO_WARNINGS 3#define _USE_MATH_DEFINES 4#include<iostream> 5#include<opencv2/opencv.hpp> 6#include <string> 7#include <windows.h> 8#include <vector> 9 10using namespace std; 11using namespace cv; 12 13bool Trimming(string folderPath, vector<string> &file_names) 14{ 15 HANDLE hFind; 16 WIN32_FIND_DATA win32fd; 17 string search_name = folderPath + "\"; 18 19 hFind = FindFirstFile(search_name.c_str(), &win32fd); 20 21 if (hFind == INVALID_HANDLE_VALUE) { 22 throw std::runtime_error("file not found"); 23 return false; 24 } 25 26 /* 指定のディレクトリ以下のファイル名をファイルがなくなるまで取得する */ 27 do { 28 if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 29 /* ディレクトリの場合は何もしない */ 30 printf("directory\n"); 31 } 32 else { 33 /* ファイルが見つかったらVector配列に保存する */ 34 file_names.push_back(win32fd.cFileName); 35 printf("%s\n", file_names.back().c_str()); 36 37 string adress = folderPath + "\" + file_names.back().c_str(); 38 Mat img_src = imread(adress, 1); 39 Rect roi(0, 0, 100, 36); 40 Mat cutImg = img_src(roi); 41 42 imwrite(adress, cutImg); 43 } 44 } while (FindNextFile(hFind, &win32fd)); 45 46 FindClose(hFind); 47 48 return true; 49} 50 51int main() 52{ 53 printf("トリミング開始\n"); 54 55 string folda = "C:\Users\ukon\Desktop\image_aga"; 56 vector<string> file = {}; 57 file[0] = "1.jpg"; 58 59 Trimming(folda, file); 60 61 printf("トリミング終了\n"); 62 63 waitKey(0); // キー入力待ち 64 return 0; 65} 66

参考
・C++でフォルダ以下のファイル一覧を取得する(https://qiita.com/tes2840/items/8d295b1caaf10eaf33ad)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ご指摘いただいた箇所を直してみたところ正常に動作しました。
ありがとうございました。

一応コードを残しておきます。

C++

1#define _CRT_SECURE_NO_WARNINGS 2#define _USE_MATH_DEFINES 3#include<iostream> 4#include<cmath> 5#include<opencv2/opencv.hpp> 6#include <sstream> 7#include <string> 8#include <fstream> 9#include <windows.h> 10#include <vector> 11 12using namespace std; 13using namespace cv; 14 15bool Trimming(string folderPath, vector<string> &file_names, string outPath) 16{ 17 HANDLE hFind; 18 WIN32_FIND_DATA win32fd; 19 string search_name = folderPath + "\*"; 20 string Trim_img = "F:\trimmed image"; 21 22 hFind = FindFirstFile(search_name.c_str(), &win32fd); 23 24 if (hFind == INVALID_HANDLE_VALUE) { 25 throw runtime_error("file not found"); 26 return false; 27 } 28 29 /* 指定のディレクトリ以下のファイル名をファイルがなくなるまで取得する */ 30 do { 31 if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 32 /* ディレクトリの場合は何もしない */ 33 printf("directory\n"); 34 } 35 else { 36 /* ファイルが見つかったらVector配列に保存する */ 37 file_names.push_back(win32fd.cFileName); 38 printf("%s\n", file_names.back().c_str()); 39 40 /*見つけたファイルをトリミング*/ 41 string adress = folderPath + "\" + file_names.back().c_str(); 42 string Trim_img = outPath + "\" + file_names.back().c_str(); 43 Mat img_src = imread(adress, 1); 44 Rect roi(640, 0, 640, 480); 45 Mat cutImg = img_src(roi); 46 47 imwrite(Trim_img, cutImg); 48 } 49 } while (FindNextFile(hFind, &win32fd)); 50 51 FindClose(hFind); 52 53 return true; 54} 55 56int main() 57{ 58 printf("トリミング開始\n"); 59 60 string input_folda = "入力フォルダのパス"; 61 string output_folda = "出力フォルダのパス"; 62 vector<string> file; 63 file.push_back("フォルダ内先頭のファイル名"); 64 Trimming(input_folda, file, output_folda); 65 66 printf("トリミング終了\n"); 67 68 waitKey(0); // キー入力待ち 69 return 0; 70} 71

投稿2019/10/24 05:17

onioni0024

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

コードの他の部分は見てませんが,とりあえずmain()内の下記の箇所がダメでしょう.

vector<string> file = {}; file[0] = "1.jpg"; //←ここで例外

投稿2019/10/21 10:14

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onioni0024

2019/10/23 02:32

ご回答ありがとうございます。 ご指摘いただいた辺りを見直してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問