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

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

詳細はこちら
OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2238閲覧

OpenCVで読み込んだ画像をRGBに変換したい

firstbn

総合スコア11

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/09 01:23

編集2019/10/09 01:49

目的

現在OpenCVを使って画像の読み込みをしているが、OpenCVを使うと色の順番がBGRになってしまうらしくそれをRGBに直したい。
OpenCVのcvtColorという関数を使うと変換できるようだがエラーが出てしまう。
プログラムの実行はGoogleColaboratryで行っている。

コード

pyhton

1image = pd.read_csv("./drive/MyDrive/images") 2img_list=[] 3a=[] 4 5#ファイル名に.pngを付けての取得 6for n in image['fname']: 7 n = n[:-4] 8 name = './drive/My Drive/xxx/' + n + '.png' 9 a.append(name) 10 11for i in range(len(a)): 12 img = cv2.imread(a[i]) 13 im_cv = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 14 img_list.append(im_cv)

エラーコード

--------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-9-52de486b6f25> in <module>() 9 for i in range(len(a))): 10 img = cv2.imread(a[i]) ---> 11 im_cv = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 12 x_train.append(im_cv) error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

わかる方がいましたら宜しくお願い致します。

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

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

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

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

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

yumetodo

2019/10/09 01:28

!_src.empty()ということはファイルが読み込めてないと思うんですが、そもそもpythonでそのファイル開いてbinaryデータを読み込めますか?
stdio

2019/10/09 01:30

すみません、質問に対する、タイトルの目的と文末の目的が入れ替わっている気がします。 どちらを知りたいのですか?
firstbn

2019/10/09 01:31

知識がなくて大変申し訳ないのですがそのファイルを開いてbinaryデータを読み込むとはどういうことでしょうか
firstbn

2019/10/09 01:35

画像をRGBに変換するにあたってエラーが出ているため、エラーの内容が分かれば解決するかと考えていました。目的は画像をRGBに変換したいというタイトルの通りです。わかりにくくて申し訳ありません。
firstbn

2019/10/09 01:41

そのファイルというのはimageのことですか?それともxxxの中に入っている画像のことでしょうか。
guest

回答3

0

うーん、これは一回C++で書き直して切り分けるべきか・・・?

a.py

python

1image = pd.read_csv("./drive/MyDrive/images") 2img_list=[] 3a=[] 4 5#ファイル名に.pngを付けての取得 6for n in image['fname']: 7 n = n[:-4] 8 name = './drive/My Drive/xxx/' + n + '.png' 9 print(name)

b.cpp

cpp

1#include <opencv2/imgcodecs.hpp> 2#include <opencv2/imgproc.hpp> 3#include <iostream> 4#include <string> 5int main() 6{ 7 for(std::string name; std::getline(std::cin, name);){ 8 cv::Mat img = cv::imread(name); 9 cv::Mat dest; 10 cv::cvtColor(img, dest, cv::COLOR_BGR2RGB); 11 if(dest.empty()){ 12 std::cerr << "empty!!: " << name << std::endl; 13 } 14 } 15}

どうにかしてb.cppをビルドして

`python3 a.py | ./b

投稿2019/10/09 04:03

yumetodo

総合スコア5852

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

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

firstbn

2019/10/09 05:08

回答ありがとうございました。 画像読み込みのセルと変換のセルを別にしたところ、無事に動くようになりました。 原因はわかりませんがこの方法でやってみようと思います。 考えてくださって本当に助かりました。ありがとうございます!
yumetodo

2019/10/09 16:43

セル・・・????
guest

0


error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/color.cpp:181:
error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

というエラーメッセージ

1行目は
「エラーは、OpenCV(3.4.3)の /io/opencv/modules/imgproc/src/color.cppというファイルの181行目で起きました」という意味です。
エラーが発生したプログラムの箇所を示しているだけで、エラーの詳細については何も示していません。

2行目は
「アサーション(前提として満たされるべき条件)失敗のエラーが、関数 'cvtColor'の"!_src.empty()"というアサーションにおいて発生しました」という意味です。

質問に書かれたコードの下記の行が問題の発生個所。

im_cv = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cvtColor関数の二つ目の引数は定数ですから、変数imgが空(empty)であることが原因であることが判ります。

そして、変数imgの値を決定しているのは、下記の行です。

img = cv2.imread(a[i])

==
<問題の経穴方法>

"img = cv2.imread(a[i])"
の行の次に、imgの値と、a[i]の値を表示するコードを追加してください。

そうすれば、何のファイルから画像を読み込もうとした時に、失敗するのかが判ります。

ファイルの指定に問題があるのだと思いますが、失敗例を知ることで修正方法を推測できるのではないでしょうか。

投稿2019/10/09 02:19

coco_bauer

総合スコア6915

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

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

firstbn

2019/10/09 03:11

回答ありがとうございます。指定のコードの後ろに print(i) print(a[i]) if img is None: break と記入したところ5000までエラーなく読み込むことができました。
qax

2019/10/09 03:22

それであれば、image['fname']に画像でないファイルが含まれていたということですね。
firstbn

2019/10/09 03:38

画像の名前自体をすべてimage['fname']からとってつけているため、そこにない名前が画像の名前になっているということは考えづらいです。
guest

0

ベストアンサー

cv2.imread()でファイルが読めていないと思います。
imread()をする前にa[i]を表示するなどしてパスを確認してください。

下記の処理がおかしいような気がします。

python

1#ファイル名に.pngを付けての取得 2for n in image['fname']: 3 n = name[:-4] 4 name = './drive/My Drive/xxx/' + n + '.png' 5 a.append(name)

ループに入る前のnameに何がはいいているかはこちらではわかりませんが、
ループ2回目以降、

python

1n=name[:-4]

には1ループ前の「'./drive/My Drive/xxx/' + n」が入るはずです。
その後、

python

1name = './drive/My Drive/xxx/' + n + '.png'

を実行すれば、

'./drive/My Drive/xxx/' + './drive/My Drive/xxx/' + n + '.png'

のようにパスがおかしくならないでしょうか?

投稿2019/10/09 01:42

qax

総合スコア622

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

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

firstbn

2019/10/09 01:48

回答ありがとうございます。 すみません。プログラムの写しが間違っていました。正しくはn=n[:-4]です。修正します。
qax

2019/10/09 01:56

いずれにせよ、cv2.imread()でファイルが読み込めていません。 ファイルがないか、パスが誤っているか、アクセス権がないか、そのような理由でしょう。 cv2.cvtColor()の前にprint(img)を追加して確認してみてください。Noneと表示されるはずです。
firstbn

2019/10/09 02:13 編集

plt.imshow(img)で画像が表示されるのでprintしていませんでしたが確かにNoneになってます。 フォルダの中身に検索をかけるとファイルは存在する+パスの書き間違えなどがない場合、もし考えられるならばプログラムのどこが問題だと思われますか?
yumetodo

2019/10/09 02:18

やっぱりそのnameの組み立てが怪しいと思うんですよね、だからpython単体で読み込めますか?と聞いたわけですが。
qax

2019/10/09 02:22

可能性としてですが、パスに日本語を使用していませんか? 或いは/が実は\であったりしませんか?
firstbn

2019/10/09 02:25

すみません。もう一度、print(img)をやってみたらNoneではなく行列が出力されました。
firstbn

2019/10/09 02:34

yumetodoさんすみません。python単体でのDataFrameの読みこみ方がわからないのです。自分のプログラムではPandasを使って読み込んでいます。
yumetodo

2019/10/09 02:53

いや、別にpython単体で読み込みってのはそこから有意な何かを仕様ってわけじゃなくて原因がOpenCVなのかpathの組み立てなのかを切り分けたいので、binary dataをとにかく読み込めるかを確認したいわけです。DataFrameとかいらんくないですか?
qax

2019/10/09 03:19

読み込めたのなら、その行列はどういう形ですか? print(img.shape) で確認してください。
firstbn

2019/10/09 03:21

すみません。単純に画像ファイルを読み込めるかどうかということだったんですね。 ループの中でpath=a[i]としてwith open (path,mode='rb) ~で開いてみましたが特にエラーなく開くことができました。
firstbn

2019/10/09 03:31 編集

行列の形ですが、 (128, 654, 3) (128, 377, 3) (128, 128, 3) (128, 224, 3) (128, 744, 3) (128, 220, 3) (128, 182, 3)…… といったようになっています。 5000個すべてこのような形で出力されています。
qax

2019/10/09 03:42

こちらはどうでしたか? > 可能性としてですが、パスに日本語を使用していませんか?
firstbn

2019/10/09 03:48

'./drive/My Drive/xxx/' + n + '.png'  n以外はもちろん、nは16進数で重複しない文字列になっています。なので日本語を使用しているということはないはずです。
qax

2019/10/09 03:58

念のため、n以外の部分についても、日本語・全角文字、特殊記号などが使用されていないか確認下さい。
firstbn

2019/10/09 04:05

'./drive/My Drive/xxx/' + + '.png' n以外だとこれになりますが、使用されていないと思います。半角か確認しながら打ち直して実行してみましたが先ほどと変わらないです。
qax

2019/10/09 04:20

> 回答ありがとうございます。指定のコードの後ろに > print(i) > print(a[i]) > if img is None: > break > と記入したところ5000までエラーなく読み込むことができました。 こちらの方法でエラーが出なくなったそうですが、ではどういった場合にbreakしているのか確認しましょう。 (1) breakの前にa[i]を表示する。 (2) breakされたファイルa[i]がどういった画像なのか確認する。 (3) 何回breakされたのか確認する。
firstbn

2019/10/09 04:37

多分ですがbreakされていないと思います。 for i in range(len(a)): img = cv2.imread(a[i]) print(i) print(a[i]) if img is None: break でやってみたところループを抜けずi=4999までできました。
qax

2019/10/09 04:41

それであれば、動くような気がします。 > すみません。もう一度、print(img)をやってみたらNoneではなく行列が出力されました。 こちらのコメントの後に最初のコードを実行しましたか? した場合、同様のエラーが出ますか?
firstbn

2019/10/09 04:51

同様のエラーがでます。cv2.cvtColorの行がなければエラーはでないです。なのでそこに何か問題があるのかもしれません。
firstbn

2019/10/09 05:05

画像を読み込むセルと変換するセルをわけたところエラーを吐かなくなりました! plt.imshowで表示してみましたが無事変換できているようです。 同じループ内やセルでできない原因はよくわかりませんがひとまずこの方法でやってみようと思います。 たくさんありがとうございました!一緒に考えていただいて本当に助かりました。またご縁があればよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問