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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Python

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

Q&A

解決済

1回答

437閲覧

関数の定義のやり方が分からない

sakuramochi_py

総合スコア32

OpenCV

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Python

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

0グッド

0クリップ

投稿2020/10/20 11:18

編集2020/10/21 11:21

###実現したいこと・問題点
追加で処理をする関数の作成方法が分からない
「Draw().text()」に「Draw().text().rectangle()」のように自由に処理を追加できるようになる

###詳細
OpenCVのcv2の関数を自作しコードを簡潔にするために自作ライブラリを作成途中。

既にある関数、Draw.text()に、「Draw(引数).text(引数).rectangle_text(引数)」の「.rectangle_text(引数)」ように関数を追加し、さらに追加で処理できるようにしたい。

###コード

Python

1import cv2 2 3class Draw: 4 def __init__(self,image,color,thickness = 1, line_type = default_line_type): 5 self.image = image 6 self.color = color 7 self.thickness = thickness 8 self.line_type = line_type 9 10 def ... 11 12 def text(self,x,y,text,font_scale = 1,font = default_font, inversion = False, org = False): 13 if not org: 14 ... 15 ... 16 return cv2.putText( self.image , text , ( x , y ) , font , font_scale , self.color , self.thickness , self.line_type , inversion ) # ndarray 17

###試したこととエラー
一つ目

Python

1def rectangle(self, interval): #追加の処理を行う関数を作成 2 処理 3 return ... 4 5Draw(img,(0,0,0)).text(0,0,"Hello").rectangle(2) 6 7######## 8#エラー ndarray object has no attribute rectangle 9########

二つ目

Python

1class Draw: 2 def __init__(self...): 3 ... 4 class text: #classを作成 5 def __init__(self...): 6 処理 7 return ... 8 def rectangle(self...): 9 return cv2.rectangle(self.image, ...) 10 11Draw(img,(0,0,0)).text(0,0,"Hello").rectangle(2) 12 13######## 14#エラー In rectangle in text in Draw : self.image is not defined 15########

###環境
OpenCV-最新バージョン
Python-最新バージョン

###最後に
回答よろしくお願いいたします。

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

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

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

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

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

coco_bauer

2020/10/20 11:25

「cv2を簡潔にする」というのは、具体的は何をしようとする事なのですか? 「テキストが描写された三次元関数のndarray」というのは、どういうものなのですか? テキストが、何に、どう描写されるというのでしょう。 申し訳ないですが、もっと判りやすく、イメージがわくような説明をしてもらえませんでしょうか。
sakuramochi_py

2020/10/20 13:07 編集

すいません、説明が不十分でしたので少し編集させていただきました。しかし、質問にあまり関係しない部分なので気にしないでいただきたいです。私が言いたいのは、Draw.text関数が返還するのはNoneではなく配列であるということです。よろしければ回答お願いします。
toast-uz

2020/10/21 10:49

質問文の「コード」から「試したこと」ができませんので、再度確認して、質問文を修正お願いします。 「コード」では、text(self,x,y,text, ・・・) となっていますが、「試したこと」はいずれも text("Hello",0,0)となっていて、引数の順番が違います。よって「試したこと」で書き加えたコード以上の違いがあると思います。
sakuramochi_py

2020/10/21 11:19

toast-uzさんご指摘ありがとうございます。 修正させていただきます。
guest

回答1

0

ベストアンサー

一つ目の方針でよいのですが、text関数の返り値をselfにする必要があります。
そうすることで、Draw(img,(0,0,0)).text(0,0,"Hello")がDraw型になりますので、繰り返し、Drawのメソッドを重ねることができます。ちなみに__init__は暗黙にreturn selfする動作が組み込まれています。

rectangle関数をどう実装されるかは不明でしたので、私の方ではtext関数を重ねて複数のテキストを表示させたり、便利なshow関数でそのまま表示させたり、といった例を作ってみました。参考にしてください。

Python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5default_line_type = 8 6default_font = cv2.FONT_HERSHEY_SIMPLEX 7img = cv2.imread('a.png') 8 9class Draw: 10 def __init__(self, image, color, thickness = 1, line_type = default_line_type): 11 self.image = image 12 self.color = color 13 self.thickness = thickness 14 self.line_type = line_type 15 16 def text(self,x,y,text,font_scale = 1,font = default_font, inversion = False, org = False): 17 cv2.putText( self.image , text , ( x , y ) , font , font_scale , self.color , self.thickness , self.line_type , inversion ) # ndarray 18 return self 19 20 def show(self): 21 img = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB) 22 im_list = np.asarray(img) 23 plt.imshow(im_list) 24 plt.show() 25 return self 26 27Draw(img, (0,0,0)).text(50, 50, 'Hello').text(100, 100, "World").show()

なお、補足ですが、この実装だと、Draw型を変換していくと元のimgもあわせて変換してしまいます。バグの温床になりますので、__init__のところで、self.image = copy.deepcopy(image)と記述して、元のイメージオブジェクトを完全複写して、別物として扱えるようにすることをオススメします。このことはそれなりに深い話であるのと、質問とは別の話題であることから、こちらの件で疑問点ありましたら、別質問を立てるとよいです。

投稿2020/10/21 12:03

編集2020/10/21 12:15
toast-uz

総合スコア3266

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

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

sakuramochi_py

2020/10/22 08:56

丁寧な説明ありがとうございます! 調べ方が悪いのかもしれませんが、調べてもなかなか出てこなかったので助かりました! copy.deepcopyの件については前にtoast-uz様が回答してくださった私の質問で説明してくださっているので大丈夫です。
toast-uz

2020/10/22 10:03

そうでしたか、失礼しました!ご理解が早くて助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問