
ドロネー図を描画 Python + OpenCV
2018-11-178 min read
目次
概要
タイトルにもあるようにPython + OpenCVを用いてドロネー図を描画するサンプルを紹介します。
「顔のランドマークを検出 Python + OpenCV + dlib を使う」で紹介した、 顔の特徴点を抽出と行く行くはマージさせようと思っています。
それにしてもPythonのサンプルが思ったより少ないこと...
環境
- Python 3.7.0
- OpenCV 3.4
Subdiv2D
ドロネー三角形の分割の計算にはOpenCVのSubdiv2Dクラスを利用します。
デモ
サンプルソース
import cv2
import numpy as np
import random
def rect_contains(rect, point) :
if point[0] < rect[0] :
return False
elif point[1] < rect[1] :
return False
elif point[0] > rect[2] :
return False
elif point[1] > rect[3] :
return False
return True
def draw_delaunay(img, subdiv, delaunay_color ) :
triangleList = subdiv.getTriangleList()
size = img.shape
r = (0, 0, size[1], size[0])
for t in triangleList :
pt1 = (t[0], t[1])
pt2 = (t[2], t[3])
pt3 = (t[4], t[5])
if rect_contains(r, pt1) and rect_contains(r, pt2) and rect_contains(r, pt3) :
cv2.line(img, pt1, pt2, delaunay_color, 1, 16, 0)
cv2.line(img, pt2, pt3, delaunay_color, 1, 16, 0)
cv2.line(img, pt3, pt1, delaunay_color, 1, 16, 0)
if __name__ == "__main__" :
IMAGE_WIDTH = 500
IMAGE_HEIGHT = 500
N_POINTS = 500
img = np.zeros(
(IMAGE_WIDTH, IMAGE_HEIGHT, 3),
dtype=np.uint8
)
rect = (0, 0, IMAGE_WIDTH, IMAGE_HEIGHT)
subdiv = cv2.Subdiv2D(rect)
for i in range(N_POINTS):
points = (
random.randint(0 + 1, IMAGE_WIDTH - 1),
random.randint(0 + 1, IMAGE_HEIGHT - 1)
)
subdiv.insert(points)
draw_delaunay(img, subdiv, (255, 255, 255))
cv2.imshow('result', img)
k = cv2.waitKey(0)
cv2.destroyAllWindows()
説明
簡単に説明するとsubdiv2dクラスのインスタンスを
subdiv = cv2.Subdiv2D(rect)
で生成しています。
初期領域を与えなければ、他のどこかしらの処理でエラーになると思います。
次に、
subdiv.insert(points)
で、点群の座標をセットしています。
floatだとエラーとなります。
また、サンプルソースにも記述されているように、 初期探索領域の範囲外の座標を渡すと
cv2.error: OpenCV(3.4.3) /path/to/subdivision2d.cpp:288: error: (-211:One of arguments' values is out of range) in function 'locate'
となり、これもエラーとなります。
分割の計算自体は、
triangleList = subdiv.getTriangleList()
で行われます。
実行結果
N = 100

N = 500

N = 1000

N = 5000

参考
https://docs.opencv.org/3.4/df/dbf/classcv_1_1Subdiv2D.html
Recommends
ドロネー図を描画 Python + OpenCV
2018-11-17
JPG画像を圧縮する OpenCV + Python
2019-01-20
Python + OpenCVで顕著性 (saliecy) マップを実装
2018-12-14
Python + OpenCVのfillConvexPolyで複雑なポリゴンを描画する
2018-11-27
Python+OpenCVで任意の画像領域:ROIのみに処理 マスク画像を使って
2018-11-25
OpenCVのチャンネルエラー対処: (-215:Assertion failed) (m...
2018-11-25
顔のランドマーク検出とドロネー分割 Python + OpenCV + dlib
2018-11-17
顔のランドマークを検出 Python + OpenCV + dlib を使う
2018-10-28
Python+OpenCVでstitching パノラマ画像生成をやってみた
2018-09-06
【Python】3分でOCR環境を立ち上げ Google Colaboratory
2018-07-23
【Python】顔画像をPOST 、 顔検出 、 canvasで顔にお絵かき【JS】
2018-07-11
CentOS8 に Python + OpenCV をインストール
2021-06-05
OpenCV.jsを動かしてみる + デモ
2019-06-22
JavaScriptで画像処理100本ノックに挑戦してみた
2019-03-27
JavaScriptによる画像処理と便利なライブラリ
2019-01-14
New Posts
[AWS CDK]ECS FargateでNestJSで作成したRESTfull APIデ...
2022-05-24
[AWS CDK]S3 CloudFront OAI Route53 構成 で NextJ...
2022-05-23
[CDK]SNS+SQS+DynamoDBでBounceとComplaint情報を収集する...
2022-04-11
[AmazonSES] node.js と ejs を利用してEメールを送信する
2022-04-09
GatsbyからNext.jsへのサイト移行
2022-04-04
[AWS CDK] Lambda で S3 オブジェクトを読み書きするStackの構築
2022-03-18
[AWS CDK] S3 + CloudFrontの構築とOriginAccessIden...
2022-03-09
[AWS CDK] Bastion(踏み台)構築。SSMとEC2InstanceConne...
2022-03-06
[AWS CDK] Cognito を構築
2022-03-04
AWS CDK v2 でVPC上にAPI Gateway + Lambda + RDS +...
2022-02-28
javascriptで累積和を解く
2022-02-27
AWS Amplify で monorepo を導入し 単一リポジトリで複数プロジェクトを...
2022-02-25
AWS CDK v2 で Lambda関数のデプロイ
2022-02-23
NextJSでDevToysのようなものを作成した
2022-02-22
JSで動的計画法を利用して部分和問題を解く
2022-02-20
Hot posts!
Proxy環境下でcurlを実行する
2019-12-07
OpenCVのMatのタイプ一覧表
2018-11-25
Macでも利用できるDBクライアント MySQL PostgreSQL Oracle など
2019-12-21
TablePlusを使ってみる。シンプルでモダンなSQLクライアントツール
2018-09-30
DBクライアントツールはDBeaverをおすすめしたい
2021-03-08
AWS S3のアクセスキーIDとシークレットアクセスキーの取得 作業用ユーザを作成
2019-06-12
AtCoderで初めて色がつくまでの話(茶色) レートが中々上がらなかった原因
2018-11-25
CentOS8でEPELとPowerToolsリポジトリの有効化
2020-11-30
Macでターミナルからポートスキャンを行う方法。
2018-12-09
Python + OpenCVのfillConvexPolyで複雑なポリゴンを描画する
2018-11-27
Date
▶︎
2022 年 (23)
▶︎
2021 年 (40)
▶︎
2020 年 (30)
▶︎
2019 年 (90)
▶︎
2018 年 (89)
▶︎
2017 年 (1)
Tags
Author