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

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

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

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

C++

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

Q&A

解決済

4回答

5182閲覧

opencvの連番読み込み

yamata

総合スコア36

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/11/04 07:01

編集2016/11/07 01:22

今まで、iplimage型でコードを書いていたのですが、
多くの人の指摘があり、mat型に変更したいと考えています。

そこで、画像の連番読み込み、保存を行いたいと考えています。

以下のプログラムを作成してみたのですが、
オーバーロードされた関数"to_string"の複数のインスタンスが引数リストと一致します
というエラーがでました。

解決方法を教えていただけたらと思います。

動作環境は、opencv2.4.9です。

よろしくお願いします。

using namespace std; using namespace cv; int main(int argc,char** argv) { for(int i=1;i<=10;i++) { string filename_i="C:\\opencv_ICImage\\2016-11-1 黒ネジ10本\\Image"+to_string(static_cast<double>(i))+".bmp"; Mat src = imread(filename_i,IMREAD_UNCHANGED); resize(src,src,Size(),0.2,0.2); imshow("src",src); string filename_o="C:\\opencv_ICImage\\ノイズ除去 練習\\Image"+to_string(static_cast<double>(i))+".bmp"; imwrite(filename_o, src); cout << filename_o << "" << filename_i << endl; waitKey(100); } }

イメージ説明

イメージ説明

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

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

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

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

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

guest

回答4

0

こんにちは。

コンパイル・エラーではなく、インテリセンスのエラーですね?
もしそうなら、気持ち悪いのですが無視するしかないようです。インテリセンスは知的ではないと私は思います。

投稿2016/11/04 07:32

Chironian

総合スコア23272

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

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

yamata

2016/11/04 07:36

無視するも、プログラムが実行できないのですが、どうしようもないのでしょうか?
Chironian

2016/11/04 07:48

インテリセンスのエラーは無視しても実行出来るはずです。 でもコンパイル・エラーは無視できないですね。 調べたところ、Visual Studio 2010の手抜きが原因のようです。 http://d.hatena.ne.jp/nagoya313/20110214/1297690937 このページの内容からto_string(static_cast<long long>(i))にすれば通るだろうと思います。
yamata

2016/11/04 07:59

ありがとうございます。通りました! また、このプログラムで読み込む画像を0001から読み込みたい場合は、 どこを変更したらいいのでしょうか?
Chironian

2016/11/04 08:37

意外に面倒なんですよそれ。 #include <sstream>しておいて   std::stringstream ss;   ss << std::setw(5) << std::setfill('0') << i; 以上により、ss.str()に"00001"等の文字列が入ります。 ↓が参考になると思います。 http://ppp-lab.sakura.ne.jp/cpp/library/031.html
yamata

2016/11/07 01:24

ありがとうございます。質問に新しいエラーを載せたのですが、画像のサイズに問題があるのでしょうか?
episteme

2016/11/07 01:45

何故そんなことわざわざ訊くんだろ?  srcから幅と高さを取り出してプリントすればわかるじゃん。
Chironian

2016/11/07 02:03

メッセージをみるとサイズが0で落ちているようなので、画像ファイルのパスが間違っていて画像を読み出せていないだけのように思います。
episteme

2016/11/07 02:50

resize元とresize先が同じsrcなのも気がかり。
yamata

2016/11/07 03:47

ファイルのパスはあっていました。resize元と先を変更しても同様のエラーでした。
episteme

2016/11/07 03:51

ファイルから読み込んだ直後のMatのサイズは?
yamata

2016/11/07 03:57

1280*960です。
Chironian

2016/11/07 04:09 編集

> ファイルのパスはあっていました。 どうやって確認しました? ちゃんと画像をOpenCVが読み取れていることまで確認してますか? 例えばepistemeさんの言うようにMatのサイズを確認するのが良いと思います。 > resize元とresize先が同じsrcなのも気がかり。 これも気にしておいた方が良いです。画像を読めているのに例外になるなら可能性があります。 OpenCVの一部の関数はインプレースモード(http://imagingsolution.blog107.fc2.com/blog-entry-121.html)をサポートしてますが、どれがサポートしているのかリストがみつかりませんでした。 --- コメントが前後しました。 1280*960はプログラム上で確認されました?
yamata

2016/11/07 04:19

ファイルパス 使っているパス(コピーすると)が、他のプログラムでは正常に動作することを確認。 1280*960 プログラムで確認しました。
guest

0

C++

1#include <iostream> 2#include <opencv2/opencv.hpp> 3using namespace cv; 4 5int main(int argc, char *argv[]) { 6 namedWindow("original", CV_WINDOW_AUTOSIZE); 7 namedWindow("small", CV_WINDOW_AUTOSIZE); 8 9 Mat original = imread("sample.png"); 10 Mat small; 11 cv::resize(original, small, cv::Size(), 0.5, 0.5); 12 13 imshow("original", original); 14 imshow("small", small); 15 waitKey(); 16}

...何の問題もありませんなぁ...

投稿2016/11/07 04:15

episteme

総合スコア16614

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

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

yamata

2016/11/07 04:26

これだとうまくいきます。 連番での読み込み、保存に問題があるのでしょうか?
episteme

2016/11/07 04:29

いやでも読み込み直後のMatのサイズは正しかったんでしょ? resizeしなけりゃ正しく表示できるんでしょ?
yamata

2016/11/07 04:43

正しく表示できます。 現在、MasahikoHirataさんが作製してくださったプログラムを使っているのですが、 そのプログラムだと、0001→00010002の様に表示されます。 このことに問題はあるのでしょうか?
episteme

2016/11/07 04:57

いやいや、ここでいう"表示"は 読み込んだ直後の Mat src を imshow すればちゃんと表示されるよね? ですよ? あるいはcv::resizeせずにそのままimwriteすればファイルできるよね? ですよ? 元の質問が"cv::resizeでコケるのはなぜか?" なので、"そもそもちゃんと読めてるか"を確認したいってことです。
yamata

2016/11/07 05:18

cv::recizeせずにそのままimwriteすれば、ファイルを作ることができます。
episteme

2016/11/07 05:21

ちゃんと元画像の入ったファイルができるのね? ...だったらお手上げ。再現できんから。
yamata

2016/11/07 05:28

はい。できます。 ありがとうございました。
guest

0

ベストアンサー

コードを記載するために、新たに回答欄で。

#include <sstream> using namespace std; using namespace cv; int main(int argc,char** argv) { string input_path = "C:\\opencv_ICImage\\2016-11-1 黒ネジ10本\\"; string output_path = "C:\\opencv_ICImage\\ノイズ除去 練習\\"; string filetop = "image"; string fileExt = ".bmp"; stringstream ext_number; for(int i=1;i<=10;i++) { ext_number.str(""); ext_number.clear(stringstream::goodbit); ext_number << std::setw(5) << std::setfill('0') << i; string ext_number_str = ext_number.str(); string filename_i= input_path+filetop+ext_number_str+fileExt; Mat src = imread(filename_i,IMREAD_UNCHANGED); resize(src,src,Size(),0.2,0.2); imshow("src",src); string filename_o= output_path+filetop+ext_number_str+fileExt; imwrite(filename_o, src); cout << filename_o << "" << filename_i << endl; waitKey(100); } }

ではどうですか?

投稿2016/11/05 07:32

編集2016/11/07 06:29
MasahikoHirata

総合スコア3747

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

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

yamata

2016/11/07 01:23

ありがとうございます。質問に新しいエラーをのせたのですが、画像のサイズに問題があるためエラーがでているのでしょうか?
yamata

2016/11/07 08:20

できました!!!ありがとうございます。 差し支えなければ、前回との変更点の解説をお願いできないでしょうか?
MasahikoHirata

2016/11/07 08:23

うっかりミスでforの後に’ext_number'の文字列の初期化(空白化)を忘れていただけ。 失礼しました。 解決済みにしておいてください。
guest

0

to_string()の引数、なぜdoubleにcast?
単純にto_string(i)ではだめですか?

投稿2016/11/04 07:13

MasahikoHirata

総合スコア3747

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

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

yamata

2016/11/04 07:15

当初、to_string(i)でやっていたのですが、 同様のエラーがでるため、変更してみました。
MasahikoHirata

2016/11/04 07:22

今、試してみた。 to_string((long)i) にしてみてください。
yamata

2016/11/04 07:35

同様のエラーが出ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問