質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

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

C++

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

Q&A

解決済

3回答

13904閲覧

C++版OpenCVでimreadを使って画像を読み込むことができない

nanameko

総合スコア17

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/08/20 03:59

###質問内容
画像を読み込みたい。
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)

よろしくおねがいします。

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

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

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

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

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

guest

回答3

0

SquareData[0]=stoi(CutData[3 + j * 4]);

これ,CutDataの添え字正しいですか?
(2 + j * 4 が正解とか)

投稿2018/08/20 04:37

fana

総合スコア11654

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

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

0

ベストアンサー

C:\Users(ユーザー名)\Documents\OpenCV作業フォルダー\キャラクター発見器\ImgO\わかさぎ姫-001.jpg

日本語パス(Unicode)を使ってませんか?
■参考情報
Unicode Path/Filename for imread and imwrite

投稿2018/08/20 04:29

umyu

総合スコア5846

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

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

0

一時的に読み込んだ画像を表示するプログラムを追加しました

関数CvImgLoad内で試験的に画像を表示したいが、上手くいかないということでしょうか?
それならば、cv::waitKeyが漏れているせいかと思います。

imshowについても、次のような註記があります。

Note

This function should be followed by cv::waitKey function which displays the image for specified milliseconds. Otherwise, it won't display the image. For example, waitKey(0) will display the window infinitely until any keypress (it is suitable for image display). waitKey(25) will display a frame for 25 ms, after which display will be automatically closed. (If you put it in a loop to read videos, it will display the video frame-by-frame)

引用元:OpenCV: High-level GUI - cv::imshow()


ちらと眺めるぶんには、怪しいのは関数TextCutの方かと思います。
本当に充分な量のデータをCutDataに押し込めているのでしょうか?

全体的にグローバル変数が多くて処理が追いづらいので、
その点も含めてベクトルの扱い方を再考した方が良いかと思います。

投稿2018/08/20 04:12

編集2018/08/20 04:22
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問