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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1402閲覧

画像のトリミングがしたいpart2

occur

総合スコア16

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/08/28 03:43

やりたいこと

前回の質問の続きのようになってしまうのですが、
800*600サイズの画像を辞書に入れたサイズでトリミングしたい。

現在困っていること。

trims = {'tomato':(20,300,80,400)
,'paseri':(30,20,100,40)}

x0,y0,x1,y1 = trims['tomato']
img = image[y0:y1, x0:x1]

これでトリミングできるのですが、
trims = {'tomato':(20,500,80,500)
,'paseri':(30,20,100,40)}

x0,y0,x1,y1 = trims['tomato']
img = image[y0:y1, x0:x1]

トリミングするサイズがでかいと、
OpenCV(3.4.3) /io/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
このようなエラーが出てしまいます。
調べてみたのですがいまいち分からず・・・。すみませんが教えていただけますと助かります。。。。。。。

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

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

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

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

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

can110

2019/08/28 03:48

トリミングするサイズがでかい場合にはどうしたいのかを記載ください。
occur

2019/08/28 04:00

返信ありがとうございます! サイズがでかい場合でも指定したサイズでトリミングができるようにしたいです・・・! 例えば上記でエラーになった(20,500,80,500)でもトリミングができればと思うのですがこの書き方ではできないというエラー表記でしょうか・・・?
can110

2019/08/28 04:04

一般的にトリミングとは画像の一部を切り出す処理であり、より大きい領域を指定することはできません。 よって処理後のイメージがつかめません。 処理後の画像をどのようなイメージにしたいのか具体的な絵で説明くださると回答得られやすくなります。
occur

2019/08/28 05:30

すみません私の勘違いでした! top,bottom,left,rightの順番でトリミングするものだと思ってたので順番変えたらじぶんが思っているようにできました、、can110さんの大きい領域を指定することができませんというので気付けてました。ありがとうございました。。
guest

回答1

0

ベストアンサー

ここでトリミングしようとしているimageという画像のサイズがわからないですが,おそらく,trims['tomato']で指定しているサイズよりも,imageの画像サイズが小さいのでしょう.

トリミング自体は,画像の一部を切り取るという意味なので,当然小さい画像を,それよりも大きいサイズで切り取ることは,不可能です.

もしも大きいサイズが指定された場合には,そのサイズまで画像を拡大したいのであれば,cv2.resizeを利用するのが妥当かと思います.

また,この処理のキモになっているimg = image[y0:y1, x0:x1]は,opencvではなく,numpyの配列として処理されているはずです.
(opencvではimreadして読み込んだ画像はnumpyの多次元配列に変換されます)
そのため,img = image[y0:y1, x0:x1]のところで,opencvのエラーが出ることはないと思います.
opencvでそのエラーが出る場合は,そもそも画像が正しく読み込めてない,画像のchannel数(RGBなら,height x width x 3,Grayscaleなら,height x width)に対して正しい処理が実行されていない,などが原因と思われます.

以下の記事などを参考にして,正しく読み込めているか,画像サイズはどうなっているかを確認するのが良いと思われます.
https://note.nkmk.me/python-opencv-imread-imwrite/

投稿2019/08/28 04:57

tanimutomo

総合スコア88

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

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

occur

2019/08/28 14:13

とても丁寧に回答いただきありがとうございます!。 まさに私が勘違いしておりnumpyに変換されているのを理解してなかったことが大きな原因の一つでした!解決策だけでなく解説もとても丁寧で勉強になりましたのでベストアンサーにさせていただきました!また私のとんちんかんな質問をおみかけしましたら回答いただけますと幸いです;;
tanimutomo

2019/08/29 07:11

opencv pythonはdocumentが整理されておらず,わかりにくい点が多いですよね... 助けになったようで良かったです! 頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問