Q&A
###質問内容
画像を読み込みたい。
C++版OpenCVのimread
を使った画像読み込みで、
画像がどうして読み込まれないのか、またできればそれの解決法
を教えてほしい。
###詳細
テキストファイル(listO.txt)から画像のパスを取得し、その画像を読みこむプログラムを作っています。
しかし、画像を読み込む段階で、Img.empty()
が反応しないのにもかかわらず、
画像が読み込めていないのか実行ファイルが動作を停止します。
一時的に読み込んだ画像を表示するプログラムを追加しましたが、
(namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); imshow("Image", Img);
)
なにも表示されず、同じように動作が停止しました。
パスが間違っているということは基本ありえません。imreadで画像を読み込む際に使っている画像パスをWindowsのエクスプローラーに入力したら、問題なく画像が表示されました。
構文ミスもおそらくないと思います。(もしもあったらごめんなさい。できる限り構文ミスを探してはいます)
だから、何が原因で画像が読み込まれないのかわからないのです。
画像がどうして読み込まれないのか、またできればそれの解決法を教えてもらいたいです。
どうか、知恵をおかしください。よろしくおねがいします。
###問題の箇所のソースコード
lang
1int CvImgLoad(string imgurl, int loopcount_I)//画像のサイズ取得関数 2{ 3 Mat Img = imread(imgurl, 1);//ここです 4 if (Img.empty()) 5 { 6 error(2, loopcount_I, imgurl); 7 } 8 ImgSizeCols = Img.cols; 9 ImgSizeRows = Img.rows; 10 return 0;//cols=横,rows=縦 11} 12
###全体のソースコード
lang
1#include <opencv2/opencv.hpp> 2#include<iostream> 3#include<string> 4#include<fstream> 5#include<vector> 6#include <stdio.h> 7#include <windows.h> 8using namespace std; 9using namespace cv; 10const string OldListPass = "ListO.txt"; 11const string NewListPass = "NewListO.txt"; 12const int ImgNumber = 7600; 13vector<string> CutData; 14int ImgSizeCols; 15int ImgSizeRows; 16 17void error(int errorcode,int loopcount_I,string imgpass) 18{ 19 switch (errorcode) 20 { 21 case 0:cout << OldListPass << "が読み込めません" << endl; break; 22 case 1:cout << NewListPass << "が読み込めません" << endl; break; 23 case 2:cout << loopcount_I+1 << "回目の" <<endl<<"["<< imgpass << "]" <<endl<< "が読み込めません" << endl; break;//ImgLoad関数 24 case 3:cout << loopcount_I+1 << "行目の" << OldListPass << "に何が書かれているのか確認してください" << endl; break;//ListEroorCheck関数 25 default:cout << "エラーコードが間違っています。作成者を殴りに行きましょう" << endl; break; 26 } 27} 28 29int ListErrorCheck(string str,int loopcount_I)//リストファイルのエラーチェック関数 30{ 31 string checkstr= str.substr(0, 1); 32 if (checkstr == "C") 33 { 34 return 0; 35 } 36 else if (checkstr == " " || checkstr == "#") 37 { 38 return 1; 39 } 40 else 41 { 42 error(3, loopcount_I, "0"); 43 return -1; 44 } 45} 46 47int TextCut(string str)//リストファイル分割関数 48{ 49 stringstream ss(str); 50 string buf; 51 while (getline(ss, buf, ' ')) 52 { 53 CutData.push_back(buf); 54 } 55 return 0; 56} 57 58int CvImgLoad(string imgurl, int loopcount_I)//画像のサイズ取得関数 59{ 60 Mat Img = imread(imgurl, 1); 61 if (Img.empty()) 62 { 63 error(2, loopcount_I, imgurl); 64 } 65 ImgSizeCols = Img.cols; 66 ImgSizeRows = Img.rows; 67 return 0;//cols=横,rows=縦 68} 69 70int main() 71{ 72 ::SetConsoleTitle(TEXT("リストファイルを開いています")); 73 ifstream OldList(OldListPass,ios::in); 74 if (OldList.fail()) 75 { 76 error(0, 0, "0"); 77 return -1; 78 } 79 fstream NewList(NewListPass,ios::out | ios::app); 80 if (NewList.fail()) 81 { 82 error(1, 0,"0"); 83 return -1; 84 } 85 86 string str; 87 int i = 0; 88 string ImgPass; 89 int SquareCount; 90 int SquareData[4]; 91 while (getline(OldList, str))//データ書き出し 92 { 93 ::SetConsoleTitle(TEXT("リストファイルのエラーチェックをしています")); 94 if (ListErrorCheck(str, i) == 0) 95 { 96 ::SetConsoleTitle(TEXT("リストファイルのデータを読み込んでいます")); 97 TextCut(str); 98 ImgPass = CutData[0]; 99 SquareCount = stoi(CutData[1]); 100 ::SetConsoleTitle(TEXT("リストファイルに一部出力しています")); 101 NewList << ImgPass << " " << SquareCount; 102 ::SetConsoleTitle(TEXT("再び、リストファイルのデータを読み込んでいます"));//ここ 103 CvImgLoad(ImgPass, i); 104 for (int j = 0; j < SquareCount; j++) 105 { 106 SquareData[0]=stoi(CutData[3 + j * 4]); 107 SquareData[1]=stoi(CutData[4 + j * 4]); 108 SquareData[2]=stoi(CutData[5 + j * 4]); 109 SquareData[3]=stoi(CutData[6 + j * 4]); 110 ::SetConsoleTitle(TEXT("リストファイルの修正をしています")); 111 if (SquareData[0] + SquareData[2] < ImgSizeCols) 112 { 113 SquareData[2] = ImgSizeCols - SquareData[0]; 114 } 115 if (SquareData[1] + SquareData[3] < ImgSizeRows) 116 { 117 SquareData[3] = ImgSizeRows - SquareData[1]; 118 } 119 120 ::SetConsoleTitle(TEXT("新しいリストファイルに書き出しています")); 121 NewList << " " << SquareData[0] << " " << SquareData[1] << " " << SquareData[2] << " " << SquareData[3]; 122 } 123 } 124 NewList << endl; 125 cout << "現在、" << i << "/" << ImgNumber << "枚目で、" << i / ImgNumber * 100 << "%です。" << endl; 126 i++; 127 } 128 ::SetConsoleTitle(TEXT("リストファイルを閉じています")); 129 NewList.close(); 130 OldList.close(); 131 132 ::SetConsoleTitle(TEXT("処理が完了しました。終了してください")); 133 system("pause"); 134 return 0; 135}
###実行結果
タイトルバーが
「再び、リストファイルのデータを読み込んでいます」
なときに、
Project.exeは動作を停止しました 問題が発生したため、プログラムが正しく動作しなくなりました。プログラ ムは閉じられ、解決策がある場合は Windows から通知されます
と表示される。
NewListO.txtはなぜか空のままであるが、今回の質問とは関係ない。
###ファイル構成
Source.cpp
ListO.txt
NewList.txt が同じフォルダーにある
C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO
に7500枚ぐらいのjpgファイル
ListO.txtの中身
C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\わかさぎ姫-001.jpg 1 300 58 608 868 C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\わかさぎ姫-002.jpg 1 96 6 640 954 C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\わかさぎ姫-003.jpg 1 46 34 660 754 C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\犬走椛-001.jpg 1 28 18 594 392 C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\犬走椛-002.jpg 1 240 68 372 678 (このようなものが7500行程度続く)
NewListO.txtは
実行ファイル実行前は空である。
###環境
VisualStudio2017
Windows8.1
C++版OpenCV3.4.2
C++
###調べたサイト
Physics-Station phst.hateblo.jp-Visual Studio 2017 x64 で OpenCV 3.2.0 を使う方法
OpenCVで遊ぼう!-サンプルコードを動かしてみよう
(公式サイト:OpenCV library)
よろしくおねがいします。
回答3件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。