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

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

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

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

Q&A

解決済

2回答

1211閲覧

Pythonの射影変換の結果表示について

TMaccount2

総合スコア9

Python

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

0グッド

0クリップ

投稿2019/08/20 05:09

前提・実現したいこと

Pythonでクリックした4つの座標を元に射影変換を行うプログラムを作りました。クリックした4点の座標を結んだ部分だけを切り抜いて結果表示させたいのですが、画像全体が結果として表示されてしまいます。どこを直せばよいのか皆目見当がつかないので教えていただきたいです。よろしくお願いいたします。

該当のソースコード

# -*- coding: utf-8 -*- """ """ import cv2 import numpy as np """ select_point関数(変換元画像の座標選択) """ def select_point(event, x, y, flags, param): if event == cv2.EVENT_FLAG_LBUTTON: cv2.circle(img, (x,y), 3, (255,0,0), -1) points.append(x) points.append(y) print(points) """ グローバル変数など """ img = cv2.imread('image10.jpg') rows, cols, ch = img.shape points = [] cv2.namedWindow('input') cv2.setMouseCallback('input', select_point) """ マウス操作(4点を選択) """ while(1): cv2.imshow('input',img) if cv2.waitKey(1) & 0xFF == 27: break """ ホモグラフィ変換 """ pts1 = np.float32([[points[0],points[1]],[points[2],points[3]],[points[4],points[5]],[points[6],points[7]]]) pts2 = np.float32([[0,38],[146,38],[146,238],[0,238]]) # 変換行列の作成 M = cv2.getPerspectiveTransform(pts1, pts2) # 画像の変換 dst = cv2.warpPerspective(img, M, (500, 706)) # 変換結果の表示 cv2.imshow('perspective',dst) cv2.imwrite("image.jpg", dst) cv2.waitKey(0) cv2.destroyAllWindows()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

上記のコードでは、image10.jpgを読み込み、クリックで4点の座標を決めてESCキーを押すと射影変換が行われ、image.jpgが吐き出されるという感じになっています。

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

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

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

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

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

can110

2019/08/20 08:31

コード中に[0,38]など意味ありげな決め打ちの数値がいくつもみられますが、これらは何を表しているのでしょうか? 変換元の画像、選択すべき4点の座標、理想の(欲しい)結果画像イメージを提示されると回答得られやすくなります。
guest

回答2

0

ベストアンサー

実現したいことが把握できていませんが、以下のように変換先(dst)の領域を指定すると、それらしい結果が得られるかと思います。

Python

1# 略 2""" ホモグラフィ変換 """ 3pts1 = np.float32([[points[0],points[1]],[points[2],points[3]],[points[4],points[5]],[points[6],points[7]]]) 4#pts2 = np.float32([[0,38],[146,38],[146,238],[0,238]]) 5dst_w, dst_h = 500, 706 6pts2 = np.float32([[0,0],[dst_w,0],[dst_w,dst_h],[0,dst_h]]) 7# 略 8# 画像の変換 9#dst = cv2.warpPerspective(img, M, (500, 706)) 10dst = cv2.warpPerspective(img, M, (dst_w, dst_h)) 11# 略

イメージ説明
イメージ説明

投稿2019/08/20 12:48

can110

総合スコア38233

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

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

TMaccount2

2019/08/21 05:02

ありがとうございます。僕のやりたいことが大体できているみたいなので助かりました。
can110

2019/08/21 05:16

「やりたいこと」が明確ではないので、なんとも云えませんが… 追記・修正依頼に書いたことについて質問本文を修正いただくと 後に同じような問題に出会った人に役立つ情報になるかと思います。
guest

0

4点選択しても、while ループが終了しないので、そこで処理がストップしてしまっています。
4点選択したかどうかを判定するフラグ変数を1つ用意し、4点選択した場合はループを抜けるようにしてみてはどうでしょうか

python

1# -*- coding: utf-8 -*- 2""" 3""" 4import cv2 5import numpy as np 6 7 8def select_point(event, x, y, flags, param): 9 """変換元画像の4点を選択する。 10 """ 11 global is_complete 12 if event == cv2.EVENT_FLAG_LBUTTON: 13 cv2.circle(img, (x, y), 3, (255, 0, 0), -1) 14 points.append([x, y]) 15 print(x, y, len(points)) 16 17 if len(points) == 4: 18 is_complete = True # 4点選択した場合、フラグをたてる。 19 20 21# 画像を読み込む。 22img = cv2.imread('sample.jpg') 23is_complete = False # 4点の選択が完了したかどうか 24points = [] 25 26cv2.namedWindow('input') 27cv2.setMouseCallback('input', select_point) 28 29while True: 30 cv2.imshow('input', img) 31 cv2.waitKey(1) 32 33 if is_complete: 34 cv2.destroyWindow("input") 35 break 36 37# 変換前、変換後の4点 38pts1 = np.float32(points) 39pts2 = np.float32([[0, 38], [146, 38], [146, 238], [0, 238]]) 40 41# ホモグラフィ変換行列を計算する。 42M = cv2.getPerspectiveTransform(pts1, pts2) 43 44# ホモグラフィ変換を画像に適用する。 45dst = cv2.warpPerspective(img, M, (500, 706)) 46 47# 変換結果の表示 48cv2.imshow('perspective', dst) 49cv2.waitKey(0) 50 51cv2.imwrite("image.jpg", dst) 52

投稿2019/08/20 07:37

tiitoi

総合スコア21956

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

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

can110

2019/08/20 08:28

質問文に記載ありますが、ESCキーを押すことにより後続の変換処理に移行するそうです。
tiitoi

2019/08/20 08:43

コメントありがとうございます。 すみません。見落としていました。 そうだとすると、変換は一応できているけど、意図通りにいかないということでしょうかね。
can110

2019/08/20 08:52

おそらくそうだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問