動画にタイムコードを入れる
動画ファイルを読み出し、動画の右下にタイムコードを入れて保存します。スタートを 00秒:00フレーム として現在の秒とフレームを表示します。
環境
準備
動画ファイルは動画ACの「ゆったり進む船」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’211_640x360.mov'で保存しました(動画のサイズは640x360)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したものを、また容量の制限があるため15秒の動画の冒頭4秒を下に貼ります。
コード
get(cv2.CAP_PROP_POS_MSEC)で現在の時間(msec)、cap.get(cv2.CAP_PROP_POS_FRAMES)で現在のフレームを取得しタイムコードを生成、putTextでフレームの右下にタイムコードを描いて、mp4ファイルとgifアニメーションで保存します。
なお保存する動画のフレームサイズはもとの640x360を縦横半分の320x180にしています。
from PIL import Image import cv2 # gifファイル作成用イメージリスト images =[] # 動画ファイルのキャプチャー cap = cv2.VideoCapture('211_640x360.mov') # 動画ファイルのフレームレート取得 fps = cap.get(cv2.CAP_PROP_FPS) # 保存用動画ファイルのフォーマット設定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('timecode.mp4', fourcc, fps, (320, 180)) # 動画を1コマずつ取り込んで処理 while(cap.isOpened()): ret, frame = cap.read() # キャプチャー画像の取り込み if ret==True: # キャプチャー画像がある場合 # 現在時間を取得 time = cap.get(cv2.CAP_PROP_POS_MSEC) # 現在のフレーム数を取得 frame_n = cap.get(cv2.CAP_PROP_POS_FRAMES) # タイムコードを作成 timecode = str(int(time//1000)).zfill(2)+':'+str(int(frame_n%fps)).zfill(2) # 縦横半分にリサイズ resize = cv2.resize(frame, (320, 180)) # タイムコードを動画に追加 cv2.putText(resize, timecode, (260, 170), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), lineType=cv2.LINE_AA) # mp4動画を保存 out.write(resize) # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加 matrix_pil = Image.fromarray(cv2.cvtColor(resize, cv2.COLOR_BGR2RGB)) images.append(matrix_pil) else: # キャプチャー画像がない場合はループ終了 break cap.release() # 再生画像をクローズ out.release() # 出力動画ファイルをクローズ # gif動画保存 images[0].save('timecode.gif', save_all=True, append_images=images[1:], optimize=False, duration=1000/fps, loop=0)
実行結果
赤い文字でタイムコードが入った動画が保存されます。
以下のサイトを参考にさせていただきました
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存
ブログランキングに参加しています
ブログの検索順位を調べる
ブログの検索順位を調べます。google検索の結果をスクレイピングしその中にこのブログ(Pythonでいろいろやってみる)が含まれているかを調べます。requestsで検索の実行および結果の取得を行い、beautifulsoup4で取得した結果(html)から必要な情報を取得し、urlにこのブログのドメイン(https://tat-pytone.hatenablog.com)が含まれているかどうかを調べます。
コードは【Webスクレイピング入門】Google検索の上位サイトを件数指定して表示する方法に掲載されているものを全面的に使わせていただきました。詳細な説明もあり大変参考になります。
関連記事
食べログ全国ランキングTOP20の星をジャンル別に比較する
Yahooニュース・アクセスランキングの見出しを取得し頻出単語を調べる
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.8.8
- requests 2.26.0
- beautifulsoup4 4.10.0
コード
【Webスクレイピング入門】Google検索の上位サイトを件数指定して表示する方法のコードに、検索結果のURLにブログのドメインが含まれている場合に★をつけるよう追加しました。
検索ワードとして'python 画像 アスキーアート'を使い、検索順位10位までを取得します。
import requests from bs4 import BeautifulSoup # Google検索するキーワードを設定 search_word = 'python 画像 アスキーアート' # ブログのドメイン domain = 'https://tat-pytone.hatenablog.com' # 上位から何件までのサイトを抽出するか指定する pages_num = 10 + 1 print(f'【検索ワード】{search_word}') # Googleから検索結果ページを取得する url = f'https://www.google.co.jp/search?hl=ja&num={pages_num}&q={search_word}' request = requests.get(url) # Googleのページ解析を行う soup = BeautifulSoup(request.text, "html.parser") search_site_list = soup.select('div.kCrYT > a') # ページ解析と結果の出力 for rank, site in zip(range(1, pages_num), search_site_list): try: site_title = site.select('h3.zBAuLc')[0].text except IndexError: site_title = site.select('img')[0]['alt'] site_url = site['href'].replace('/url?q=', '') # URLにブログのドメインが含まれていれば★をつける if domain in site_url: mark = '★' else: mark = '' # 結果を出力する print(mark + str(rank) + "位: " + site_title + ": " + site_url)
実行結果
4位にランクインしていることがわかります。
【検索ワード】python 画像 アスキーアート 1位: PythonとOpenCVで画像をアスキーアート化するプログラムを作った: https://qiita.com/Pavaux/items/450ac6823e86b092cfbb&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAgQAg&usg=AOvVaw3g2l03bqQ4MJrIuiR7myZy 2位: Pythonで画像からアスキーアートを生成してみる - Qiita: https://qiita.com/yukid/items/a96a036564e1c93c3ae9&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAcQAg&usg=AOvVaw3OjjduCvNyamrVdsbhHlkt 3位: PythonとOpenCVで画像をアスキーアート化してみる(トレースAA ...: https://nehori.com/nikki/2021/04/04/post-27881/&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAoQAg&usg=AOvVaw34kw_TvSIdD2Pods6f7TKk ★4位: アスキーアートを自動生成する - Pythonでいろいろやってみる: https://tat-pytone.hatenablog.com/entry/2020/02/26/202205&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAkQAg&usg=AOvVaw2NYFbKmDFrzHYfRwFFxSB8 5位: Pythonを使って画像をアスキーアートに変換するスクリプト: https://blog.tkrel.com/347&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAsQAg&usg=AOvVaw2qoj9YtdKTyTrzxTviyjg6 6位: Pythonで鬼滅の刃の炭治郎を描きます。OpenCVで画像から ...: https://www.youtube.com/watch%3Fv%3DfSA_sT9LAqw&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQtwJ6BAgBEAE&usg=AOvVaw1HgRkvIAo_GdqHsSONjwkx 7位: 「python 画像 アスキーアート」の動画: https://www.youtube.com/watch%3Fv%3DfSA_sT9LAqw&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQuAJ6BAgBEAI&usg=AOvVaw3sOfP-SVV1xUFaai9Piqnj 8位: Python アスキーアートを作った - 渡邊直樹のブログ: https://naokiwatanabe.blogspot.com/2014/10/python.html&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAMQAg&usg=AOvVaw14aEo95q0Z4MxCyjwrUBiD 9位: アスキーアートを自動生成する - Pythonでいろいろやってみる: https://itnews.org/news_resources/137856&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAAQAg&usg=AOvVaw1io297U4DvgysvJsFODSYd 10位: 画像からAA(アスキーアート)を作る機能を作ってみたけど: https://tetorachaos.com/image-to-aa1&sa=U&ved=2ahUKEwiTmIiwsYb1AhXDLH0KHaACCbkQFnoECAUQAg&usg=AOvVaw3PPnlJj8CIbg3BH_bQYrYO
検索ワードを'python 画像 鮮やか'に変えて試します。
コード
import requests from bs4 import BeautifulSoup # Google検索するキーワードを設定 search_word = 'python 画像 鮮やか' # ブログのドメイン domain = 'https://tat-pytone.hatenablog.com' # 上位から何件までのサイトを抽出するか指定する pages_num = 10 + 1 print(f'【検索ワード】{search_word}') # Googleから検索結果ページを取得する url = f'https://www.google.co.jp/search?hl=ja&num={pages_num}&q={search_word}' request = requests.get(url) # Googleのページ解析を行う soup = BeautifulSoup(request.text, "html.parser") search_site_list = soup.select('div.kCrYT > a') # ページ解析と結果の出力 for rank, site in zip(range(1, pages_num), search_site_list): try: site_title = site.select('h3.zBAuLc')[0].text except IndexError: site_title = site.select('img')[0]['alt'] site_url = site['href'].replace('/url?q=', '') # URLにブログのドメインが含まれていれば★をつける if domain in site_url: mark = '★' else: mark = '' # 結果を出力する print(mark + str(rank) + "位: " + site_title + ": " + site_url)
実行結果
1位にランクされています。
【検索ワード】python 画像 鮮やか ★1位: 画像の彩度、明度を変える - Pythonでいろいろやってみる: https://tat-pytone.hatenablog.com/entry/2019/04/14/193237&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAEQAg&usg=AOvVaw3oawQbLrbB4l442KB_z6AY 2位: 【Pillow】画像の鮮やかさ・コントラスト・明るさ・シャープネス調整: https://python-no-memo.blogspot.com/2020/04/pillow.html&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAoQAg&usg=AOvVaw1hSHkEyW6Y_y5IoSmAxYiE 3位: 続・rawpyでPython現像 (彩度・シャープネス調整) | キャンプ工学: https://campkougaku.com/2020/01/16/rawpy-sat/&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAsQAg&usg=AOvVaw1m6xsPngW30XJ727mzcRwV 4位: 【Python/OpenCV】赤・緑・青色の検出(HSV色空間) | 西住工房: https://algorithm.joho.info/programming/python/opencv-color-detection/&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAkQAg&usg=AOvVaw1P4Dq9FymrbJWfmKsZAnxp 5位: [PDF] 画像処理1︓画像の記録形式: http://www.mi.u-tokyo.ac.jp/consortium2/pdf/ImageProcessing1%2520-%2520Python%2520Sample.pdf&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAcQAg&usg=AOvVaw2M698bd-aF2QkkrA-UUjm7 6位: OpenCVでRGBとHSVのヒストグラムを取得する方法 - Qiita: https://qiita.com/tatsuya11bbs/items/ff4a07d73e14385b6922&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAgQAg&usg=AOvVaw0eKBjGHSq8qkKzVK7GjApg 7位: 【Python+OpenCV】特定の色を検出するプログラム | CRAFT GoGo: https://craft-gogo.com/python-opencv-color-detection/&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAAQAg&usg=AOvVaw1onPKKDHectoOqPMltO1RC 8位: 画像処理入門講座 : OpenCVとPythonで始める画像処理 | POSTD: https://postd.cc/image-processing-101/&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAUQAg&usg=AOvVaw1_tiYfm6yhISDDZQ_Pv8HE 9位: OpenCV 入門 (10) - 色の抽出|npaka|note: https://note.com/npaka/n/nc6764b99dbe0&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAIQAg&usg=AOvVaw2akInXVM8s11pqjNnpFGUt 10位: OpenCV 画像の色相、彩度、明度の変更【HSV】 | sciencompass: https://sciencompass.com/machine-learning/opencv_rgb_hsv_change&sa=U&ved=2ahUKEwjqgL6FsYb1AhUzO30KHTcVAWAQFnoECAQQAg&usg=AOvVaw3yKsvJ2DFfez4h2VsKjurf
以下のサイトを参考にさせていただきました
【Webスクレイピング入門】Google検索の上位サイトを件数指定して表示する方法
ブログランキングに参加しています
動画をマトリックス風に変換する
画像をマトリックス風に変換する について、「動画でやってみたら面白いのでは」とコメントいただいたので動画を映画「マトリックス」の仮想現実シーンのように変換するコードを作りました。動画から1コマずつ画像を取り込み、取り込んだ画像をエッジ検出、エッジ部分を反転した緑色のカタカナで置き換えます。作成した画像を再度動画に変換します。
関連記事
画像をマトリックス風に変換する
アスキーアートを自動生成する
環境
準備
画像ファイルは動画ACの「音楽を楽しむ男性」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’2065_640x360.mp4'で保存しました(動画のサイズは640x360)。このブログにはmp4ファイルが貼れないのでアニメーションgifファイルに変換したものを、また容量の制限があるため動画の前半を下に貼ります。
コード
pillowでカタカナの文字列を画像化し180°回転し反転したカタカナ画像を作成します。動画の取り込みはOpenCVのcv2.VideoCaptureを使い、取り込んだ画像をグレースケール変換しcv2.Cannyでエッジ検出、エッジ画像の画素値を調べエッジがあれば反転文字列のランダムな文字に置き換えます。作成した画像からcv2.VideoWriterでmp4動画を作成、またpillowでアニメーションgifファイルも作成しています。
画像データのフォーマットが異なるpillowとOpencvの間で画像のやり取りがあるので、都度形式を変換しています(PillowはRGB形式、OpencvはBGR形式のnp.ndarray)。
from PIL import Image, ImageDraw, ImageFont import numpy as np import cv2 import random # 反転カタカナ画像の作成 font_size = 8 # フォントサイズ text = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン1234567890#%&$' # 文字列 font = ImageFont.truetype('C:\Windows\Fonts\msgothic.ttc', font_size) # フォントの指定 im = Image.new('RGB', (int(len(text)/2*font_size), font_size), (0, 0, 0)) # 下地となるイメージオブジェクトの生成 draw = ImageDraw.Draw(im) # drawオブジェクトを生成 draw.text((0, 0), text, fill=(180, 255, 180), font=font) # 文字列を画像に描画 im_rotate = im.rotate(180) # 180°回転 # pillow形式の画像をopencv形式に変換 text_img = cv2.cvtColor(np.array(im_rotate, dtype=np.uint8), cv2.COLOR_RGB2BGR) # gifファイル作成用イメージリスト images =[] # 元の動画ファイルのキャプチャー cap = cv2.VideoCapture('2065_640x360.mp4') # 保存用動画ファイルのフォーマット設定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('matrix.mp4', fourcc, 25.0, (640, 360)) # 動画を1コマずつ取り込んで処理 while(cap.isOpened()): ret, frame = cap.read() # キャプチャー画像の取り込み if ret==True: # キャプチャー画像がある場合 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 画像をグレースケール変換 edges = cv2.Canny(gray, 50, 150) # 画像のエッジ検出 # font_sizeの整数倍にエッジ画像をリサイズ height, width, _ = frame.shape resize_x = width//font_size*font_size resize_y = height//font_size*font_size resize = cv2.resize(edges, (resize_x, resize_y)) # リサイズしたエッジ画像と同じサイズの黒画像を生成 matrix = np.zeros((resize_y, resize_x, 3), np.uint8) # ブロックごとの画素最大値が1以上か判定 for y in range(0, resize_y, font_size): for x in range(0, resize_x, int(font_size/2)): if np.amax(resize[y:y+font_size, x:x+int(font_size/2)])>0: pos = int(random.random()*len(text))*int(font_size/2) matrix[y:y+font_size, x:x+int(font_size/2)] = text_img[0:font_size, pos:pos+int(font_size/2)] out.write(matrix) # mp4動画を保存 # opencvからpillow形式に変換しgifファイル作成用リストimagesに追加 matrix_pil = Image.fromarray(cv2.cvtColor(matrix, cv2.COLOR_BGR2RGB)) images.append(matrix_pil) else: # キャプチャー画像がない場合はループ終了 break cap.release() # 再生画像をクローズ out.release() # 出力動画ファイルをクローズ # gif動画保存 images[0].save('matrix.gif', save_all=True, append_images=images[1:], optimize=False, duration=30, loop=0)
実行結果
エッジが緑の反転カタカナで置換された動画が作成されました。
以下のサイトを参考にさせていただきました
Pythonの文法メモ > 【OpenCV】画像読み出しとサイズ・画素情報取得、切り抜き、貼り付け、チャネル操作
Pythonの文法メモ > 【OpenCV】画像サイズを変更するresize
Pythonの文法メモ > 【Numpy】インデックス・スライスによるndarray要素の取得
ブログランキングに参加しています
グリーンバックの人物を背景と合成する
クロマキー合成では人の肌の色から遠いブルーやグリーンの背景を使って人物を撮影し、背景色の青や緑を透明にして別画像に合成します。
グリーンバックの人物写真から人物を切り抜いて風景写真に張り付けます。人物写真の人物部分を黒、グリーンの背景を白に変換したマスク画像を使ってPillowのImage.compositeにより風景画像の上に人物を合成します。
関連記事
コラージュ写真を作る
コラージュ写真を作る
画像にキラキラした文字を入れる
環境
- windows10 home
- jupyter notebook 6.3.0
- Python 3.8.8
- Pillow 8.2.0
準備
画像ファイルはフリー写真素材ぱくたそから2つの画像をダウンロードさせていただき、640x400のサイズに変形後、jupyter notebookファイル(.ipynb)と同じディレクトリに、ファイル名'shopping.jpg','czech.jpg'で保存しました。グリーンバックの画像'shopping.jpg'の人物のみを切り抜いてチェコの街の風景に貼り付けます。
shopping.jpg
czech.jpg
コード
グリーンバックの写真をHSV色空間に変換し、pointメソッドにより色相Hが緑の範囲を黒、それ以外を白としたマスク画像を作ります。compositeメソッドでマスク画像の黒の部分には背景の写真を、白の部分には人物の写真を合成します。
from PIL import Image # 画像の読み出し im1 = Image.open('shopping.jpg') im2 = Image.open('czech.jpg') # グリーンバックの画像をHSV変換 im1_hsv = im1.convert('HSV') # HSV画像をチャンネル別に分割 source = im1_hsv.split() # Hが99から108の範囲を採用し画素値を255としてマスク画像を作成 mask = source[0].point(lambda i: 99< i < 108 and 255) # マスク画像の白にim2、マスク画像の黒部分にim1を割り当てて合成 im = Image.composite(im2, im1, mask) # 画像の保存 im.save('shopping_in_czech.jpg')
実行結果
女性が切り抜かれてチェコの街並みに合成されました。
以下のサイトを参考にさせていただきました
GeeksforGeeks >> Python PIL | Image.point() method
ブログランキングに参加しています
複数の写真から検出した人物を切り抜いて並べる
複数の写真から検出した人物を切り抜いて一つの画像に並べます。OpenCVの顔検出で顔の位置を特定しその上下左右を切り抜くことで人物を抽出します。顔検出はOpenCVに付属するHaar特徴ベースCascade型分類器による機械学習データ(検出器)のうち、正面の人の顔の機械学習データhaarcascade_frontalface_default.xmlを画像に適用することで行います。
関連記事
写真から顔検出をする(人間、猫)
顔にモザイクをかける
まちまちなサイズの複数の画像をきれいに並べて一枚の画像にまとめる
使った関数・メソッド
- cv2.imread : 画像ファイルの読み出し
- cv2.CascadeClassifier : 学習データの読みだし
- cv2.CascadeClassifier.detectMultiScale : オブジェクトを検出し検出範囲の矩形データ(x、y、幅、高さ)を返す
- cv2.resize : 画像サイズ変更
- cv2.imwrite : 画像をファイルに保存
環境
準備
人の写っている5枚の画像ファイルをフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにフォルダ'pics'を作って保存しました。
また、正面の顔の特徴量学習データファイルhaarcascade_frontalface_default.xmlをjupyter notebookファイルと同じディレクトリにコピーしています。
コード
import os import numpy as np import cv2 # picsフォルダ内のファイルをリストに files = os.listdir('pics/') # 連結元の画像の作成 people = np.zeros((400, 1, 3), np.uint8) # 特徴量学習データhaarcascade_frontalface_default.xmlを読み込みface_cascadeに代入 face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # ファイルの数だけ繰り返す for i in files: # 画像ファイルの読み込み img = cv2.imread(i) # 画像に顔検出を適用 faces = face_cascade.detectMultiScale(img) # 検出した顔の数だけ、x,y,width,heightを取り出す for x, y, width, height in faces: # 人物部分を切り取る person = img[y-40:y+350, x-40:x+120] # 切り取った人物のサイズ height, width, ch = person.shape # 高さ400にリサイズ resize = cv2.resize(person, (int(width*400/height), 400)) # リサイズした画像をpeopleに連結 people = cv2.hconcat([people, resize]) # 画像を保存 cv2.imwrite('people.jpg', people)
実行結果
自動的に人物が切り抜かれ一枚の画像にまとめられました。
以下のサイトを参考にさせていただきました
Pythonの文法メモ >> 【OpenCV】画像サイズを変更するresize
ブログランキングに参加しています
電光掲示板のように文章が右から左にスクロールするGIFアニメを作成する
電光掲示板のように文章が右から左にスクロールするGIFアニメを作成します。横長の画像に文章を書きその画像の一部を左から右に切り取りそれを順番に表示することでスクロールを表現します。
関連記事
画像を描画しアニメーションGIFを作成する
字幕がスクロールするGIFアニメを作成する
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.8.8
- Pillow 8.2.0
コード
from PIL import Image, ImageDraw, ImageFont # ImageDrawオブジェクトを生成し文字を描画 im = Image.new('RGB', (1580, 70), (10, 10, 40)) font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 32) draw = ImageDraw.Draw(im) draw.text((210, 12), '自民党はやや議席を減らしたものの単独で絶対安定多数を確保するに至りました', fill=(200, 160, 20), font=font) # 文字画像を位置をずらしながら部分的にクロップしリストに追加 images =[] # イメージ用リスト for x in range(0, 1380, 2): im_crop = im.crop((x, 0, x+200, 70)) images.append(im_crop) # gifアニメ保存 images[0].save('text_scroll.gif', save_all=True,append_images=images[1:], optimize=False,duration=30, loop=0)
実行結果
電光掲示板のように文章がスクロールするGIF動画が生成されます
ブログランキングに参加しています
四角の中に円を充てんする
四角の中に大きさの異なる円を重ならないようにできるだけ多く描画します。すでに描画した円の座標および半径をリストに記録しておいて、新しく描こうとする円と重ならないかをチェックし、重ならない場合描画します。これを繰り返し試行することで円の充てん率を上げます。
環境
コード
import cv2 import numpy as np import random import math # 描画用の画像の作成 img = np.zeros((600, 600, 3), np.uint8) img[:, :, :] = 200 # 座標と半径を記録するリスト x_list = [] y_list = [] r_list = [] for i in range(400000): # 新規の円のx, y, 半径をランダムで設定 x = random.randint(1, 600) y = random.randint(1, 600) r = random.randint(8, 32) # 円の重なりチェック用変数 check = 0 # 既存の円の座標、半径のリストを順に読み出し、新規の円と重なるかをチェック。重なった場合はcheck = 1 for j in range(len(x_list)): dx = x_list[j] - x dy = y_list[j] - y if math.sqrt(dx**2 + dy**2) < r_list[j] + r: check = 1 break # 既存の円に新規の円が重ならない(check = 0)場合に円を描いて座標と半径を記録するリストに追記 if check == 0: cv2.circle(img, (x, y), r, (20, 20, random.randint(190, 250)), -1, cv2.LINE_AA) x_list.append(x) y_list.append(y) r_list.append(r) # 画像の保存 cv2.imwrite('circles.jpg', img)
実行結果
四角形が大きさの異なる円で充てんされました。