Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

動画にタイムコードを入れる

 動画ファイルを読み出し、動画の右下にタイムコードを入れて保存します。スタートを 00秒:00フレーム として現在の秒とフレームを表示します。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.8.8
  • Pillow 8.2.0
  • OpenCV 4.0.1
準備

 動画ファイルは動画ACの「ゆったり進む船」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’211_640x360.mov'で保存しました(動画のサイズは640x360)。このブログにはmovファイルが貼れないのでアニメーションgifファイルに変換したものを、また容量の制限があるため15秒の動画の冒頭4秒を下に貼ります。

f:id:T_A_T:20220117195349g:plain
211_640x360.mov(アニメーションgifに変換したもの冒頭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)  
実行結果

赤い文字でタイムコードが入った動画が保存されます。
f:id:T_A_T:20220117195802g:plain

以下のサイトを参考にさせていただきました

Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

ブログの検索順位を調べる

ブログの検索順位を調べます。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検索の上位サイトを件数指定して表示する方法

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

動画をマトリックス風に変換する

画像をマトリックス風に変換する について、「動画でやってみたら面白いのでは」とコメントいただいたので動画を映画「マトリックス」の仮想現実シーンのように変換するコードを作りました。動画から1コマずつ画像を取り込み、取り込んだ画像をエッジ検出、エッジ部分を反転した緑色のカタカナで置き換えます。作成した画像を再度動画に変換します。

関連記事

画像をマトリックス風に変換する
アスキーアートを自動生成する

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.8.8
  • Pillow 8.2.0
  • OpenCV 4.0.1
準備

画像ファイルは動画ACの「音楽を楽しむ男性」をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’2065_640x360.mp4'で保存しました(動画のサイズは640x360)。このブログにはmp4ファイルが貼れないのでアニメーションgifファイルに変換したものを、また容量の制限があるため動画の前半を下に貼ります。

f:id:T_A_T:20211228145120g:plain
2065_640x360.mp4(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)  
実行結果

エッジが緑の反転カタカナで置換された動画が作成されました。
f:id:T_A_T:20211228145610g:plain

以下のサイトを参考にさせていただきました

Pythonの文法メモ > 【OpenCV】画像読み出しとサイズ・画素情報取得、切り抜き、貼り付け、チャネル操作
Pythonの文法メモ > 【OpenCV】画像サイズを変更するresize
Pythonの文法メモ > 【Numpy】インデックス・スライスによるndarray要素の取得

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

グリーンバックの人物を背景と合成する

クロマキー合成では人の肌の色から遠いブルーやグリーンの背景を使って人物を撮影し、背景色の青や緑を透明にして別画像に合成します。
グリーンバックの人物写真から人物を切り抜いて風景写真に張り付けます。人物写真の人物部分を黒、グリーンの背景を白に変換したマスク画像を使って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
f:id:T_A_T:20211222201622j:plain

czech.jpg
f:id:T_A_T:20211222201700j:plain

コード

グリーンバックの写真を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')
実行結果

女性が切り抜かれてチェコの街並みに合成されました。
f:id:T_A_T:20211222202730j:plain

以下のサイトを参考にさせていただきました

GeeksforGeeks >> Python PIL | Image.point() method

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

複数の写真から検出した人物を切り抜いて並べる

複数の写真から検出した人物を切り抜いて一つの画像に並べます。OpenCVの顔検出で顔の位置を特定しその上下左右を切り抜くことで人物を抽出します。顔検出はOpenCVに付属するHaar特徴ベースCascade型分類器による機械学習データ(検出器)のうち、正面の人の顔の機械学習データhaarcascade_frontalface_default.xmlを画像に適用することで行います。

関連記事

写真から顔検出をする(人間、猫)
顔にモザイクをかける
まちまちなサイズの複数の画像をきれいに並べて一枚の画像にまとめる

使った関数・メソッド
  • cv2.imread : 画像ファイルの読み出し
  • cv2.CascadeClassifier : 学習データの読みだし
  • cv2.CascadeClassifier.detectMultiScale : オブジェクトを検出し検出範囲の矩形データ(x、y、幅、高さ)を返す
  • cv2.resize : 画像サイズ変更
  • cv2.imwrite : 画像をファイルに保存
環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • OpenCV 4.0.1
準備

人の写っている5枚の画像ファイルをフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにフォルダ'pics'を作って保存しました。
f:id:T_A_T:20211110211524j:plain
f:id:T_A_T:20211110211608j:plain
f:id:T_A_T:20211110211619j:plain
f:id:T_A_T:20211110211628j:plain
f:id:T_A_T:20211110211636j:plain

また、正面の顔の特徴量学習データファイル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)
実行結果

自動的に人物が切り抜かれ一枚の画像にまとめられました。
f:id:T_A_T:20211110211824j:plain

以下のサイトを参考にさせていただきました

Pythonの文法メモ >> 【OpenCV】画像サイズを変更するresize

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

電光掲示板のように文章が右から左にスクロールする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動画が生成されます
f:id:T_A_T:20211101213429g:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村

四角の中に円を充てんする

四角の中に大きさの異なる円を重ならないようにできるだけ多く描画します。すでに描画した円の座標および半径をリストに記録しておいて、新しく描こうとする円と重ならないかをチェックし、重ならない場合描画します。これを繰り返し試行することで円の充てん率を上げます。

環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • OpenCV 4.0.1
コード
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)
実行結果

四角形が大きさの異なる円で充てんされました。
f:id:T_A_T:20211031214725j:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村