2025年3月30日日曜日

【挑戦】新潟・越後湯沢の1合の爆弾おにぎりを食べてみた!その圧倒的ボリュームに驚愕した理由とは? by裏方徹也

 

はじめに

こんにちは、裏方です!最近、でべそさんが爆弾おにぎりに挑戦していましたね。実はそれ以前に裏方もこの巨大おにぎりに挑戦してきました!

正直、最初は「こんなに食べられるわけない!」と思っていたけれど、実際に食べてみると、その圧倒的ボリューム感と満足感に驚かされることに。今回はその壮絶な体験をお伝えします!

 

爆弾おにぎりって何? 1合のご飯が詰まった「ご飯の塊」!

 


 

爆弾おにぎり、ご存じですか?普通のおにぎりのサイズを軽く超えて、なんと最小でも1合のご飯を使用しているという、超ビッグサイズのおにぎりです!このおにぎり、見た目もまさに「ご飯の塊」といえるほどの迫力。

さらに、具材も超豪華!鮭、梅干し、ツナマヨ、明太子などの15種類の具から好きなものを選んで、自分だけの爆弾おにぎりが完成します。一口食べると、ボリューム感とともにその味わい深さにも圧倒されます。

ちなみに、でべそさんは4合サイズの特大爆弾おにぎりに挑戦していましたが、私は1合で十分だと思って挑戦(笑)。でも、これでも十分「挑戦」でした!

 

店舗の雰囲気と注文方法

お店は、越後湯沢駅構内のCoCoLo湯沢内にあります。駅から徒歩約5分の距離で、アクセスも抜群。店内には温かみのある木のインテリアが特徴的で、まるで昔懐かしい食堂のような落ち着いた雰囲気が漂っています。ここで食事をするのが楽しみになるような、ゆっくりと落ち着いて食事ができる場所です。

注文方法は2通り。現金払いの精算機を使うか、QRコード決済が可能なスタッフ注文のどちらかを選べます。現金以外の支払いを希望する場合は、スタッフに直接伝える形になります。

 

迫力満点!爆弾おにぎりを実際に食べてみた



 

さて、いよいよお待ちかねの爆弾おにぎりが登場!目の前に運ばれてきたその瞬間、1合のご飯がぎっしり詰め込まれたおにぎりの大きさに圧倒されました。まさに「おにぎりの王者」とでも呼ぶべき、壮大なビジュアル。

一口食べると、そのご飯の粒感がしっかりと感じられ、具材の味もそれぞれが個性を主張しています。特に高菜の食感がアクセントとなっていて、食べ進めるたびに満足感が広がっていきます。しかし、1合分のご飯はやはり半端じゃなく、途中で「もう無理かも」と思う瞬間も

でも、絶妙にバランスよく調整された具材とみそ汁のおかげで、なんとかペースを保ちつつ、最後の一口まで食べ切ることができました!正直、最初は「自分にできるのか?」と不安でしたが、挑戦して本当に良かったと心から思いました。

 

アクセス方法と行き方

越後湯沢駅から徒歩約5分、CoCoLo湯沢内にあるお店まで迷わず行けます。駅構内なので、アクセスはとても便利ですが、食事をする前に観光するのもオススメ。周辺には自然や観光地、スキー場も多いので、食後に散策する楽しみもあります。ただ、CoCoLo湯沢は改札の外にあるため途中下車する必要があります。

 

まとめ:爆弾おにぎりに挑戦したその先に待っているもの

爆弾おにぎり、見た目以上にただの大きなご飯じゃありません!そのボリューム感はもちろん、具材のバランスや味の深さに驚きます。1合のおにぎりを完食するにはかなりの覚悟が必要ですが、達成感や満腹感はその何倍も価値のあるもの。

大食いに挑戦したい方や、ただただ満腹感を味わいたい方には絶対にオススメです!食べ終わった後、「もう無理かも!」と思う瞬間がきっとあなたにも訪れるでしょう。でもその先には、言葉では表現しきれないほどの満足感が待っています。

次回はもっと大きなサイズに挑戦したい!という気持ちが自然に湧いてくるほど、挑戦しがいのある一品です。あなたもぜひ、この挑戦を楽しんでみてください!

途中下車制度でお得に旅行!JRの乗車券の知られざる活用法と注意点を徹底解説

【途中下車制度でお得に旅行!】JRの乗車券の知られざる活用法と注意点を徹底解説

目次

1. はじめに 途中下車について

皆さんは「途中下車制度」を知っていますか?電車で旅行する際、目的地に着く前に途中で寄り道したい場所があった時に追加料金なしで降りられる制度の事を言います。この制度をうまく使うと、旅行がもっとお得に、楽しくなります。意外と知られていないこの裏技を今回は徹底解説!次回の旅行で活用してみましょう。

2. 途中下車できる条件とは?

「途中下車」が利用できる条件について詳しく見ていきましょう。実は、ただ切符を買っただけでは途中下車ができない場合もあるので、しっかりチェックが必要です!

  • ① 片道100km超えの長距離
  • 途中下車は片道100kmを超える長距離に限られます。例えば、東京→名古屋のように長距離の切符では途中下車が可能ですが、短距離の切符ではこの制度は使えません。

  • ② 大都市近郊区間外の切符
  • 東京や大阪などの大都市近郊区間内で完結する切符では途中下車ができません。例えば、東京→甲府の場合、東京近郊区間内で完結しているため途中下車はできませんが、降車駅を一駅隣の金手駅に延ばせば近郊区間外の駅では途中下車が可能です。

  • ③ 特急券や一部企画乗車券は対象外
  • 特急券や一部の企画乗車券では途中下車が適用されないことがありますので、途中下車できる乗車券かどうか確認しておくことが大切です。

    

小難しく書きましたが、途中下車できるかどうか見分ける方法があります。それは下車前途無効と書かれているかどうかです。

こちらの乗車券には下車前途無効とあるので、途中下車できません。

こちらの乗車券には下車前途無効と書いていないため、途中下車できます。

ただし、以下のように都区市内各駅下車前途無効と書かれていますが、東京都区内、大阪市内などの特定のエリアに該当しない駅であれば途中下車が可能です。

3. お得な使い方実例

ここでは、実際に「途中下車制度」を使ったお得な旅行の例をいくつか紹介します。どれも簡単な工夫で安く行けます!

例1: 東京→長岡、途中高崎に寄る場合

別々に切符を買った場合 通しで切符を買った場合
東京 → 高崎(1980円)
高崎 → 長岡(3080円)
合計:5060円
東京 → 長岡(4840円)
合計:4840円(220円お得!)

例2: 東京→甲府、フルーツ公園がある山梨市や宿泊場所の石和温泉に寄る場合

別々に切符を買った場合 通しで切符を買った場合
東京 → 山梨市(2310円)
山梨市 → 石和温泉(180円)
石和温泉 → 甲府(200円)
合計:2690円
東京 → 金手※(2310円)
合計:2310円(380円お得!)

※降車駅を甲府とすると東京の大都市近郊区間内となり途中下車できなくなるため、一駅隣で区間外となる金手駅とした。

4. 注意すべきポイント

途中下車は便利ですが、いくつか注意点もあります。事前にしっかり確認して、無駄なトラブルを避けましょう。

  • 特急券や一部割引乗車券では利用できない
  • 途中下車は通常の乗車券に適用されますが、特急券や一部の割引乗車券では使えない場合があるので、切符購入時に確認を!

  • 一度途中下車したら戻れない
  • 途中下車後、戻ることはできません。例えば、東京→長岡へ向かう際、高崎で下車した場合、手前の熊谷などに戻ることはできません。注意が必要です。

  • 途中下車後の電車の時間
  • 途中下車後、次の電車に乗り遅れないようにしましょう。例えば、水上で途中下車し、長岡方面へ向かう場合、次の電車まで5時間待ちということもあります。

5. 途中下車ができるかチェックする方法

途中下車ができるかどうかを確認するには、切符の券面をよく見ることが大切です。「途中下車前途無効」と記載されていれば、その区間では途中下車ができません。また、駅の窓口で「途中下車可能か?」と聞くことで、より確実に確認できます。分からないことがあれば、駅員に気軽に聞いてみましょう。

6. まとめと次回の旅行計画

「途中下車制度」を活用することで、旅行をもっとお得に、充実したものにできます。次回の旅行で途中下車を試して、節約しながら観光を楽しんでくださいね!さらに、旅行前に「途中下車可能か?」を確認して、無駄のないプランを立てましょう。

また、途中下車を利用する際、通常の乗車券と同じように自動改札を通ることができるので、便利です。自動改札をスムーズに通過できる点も、途中下車制度を活用する際の大きなメリットです。

あなたも「途中下車」を使いこなして、素敵な旅を楽しんでください!

7.おまけ:

時には、乗車券を分割して購入することで、さらに安くなるケースもあります。

例1: 東京→長岡、途中越後湯沢に爆弾おにぎりを買いに寄る場合

別々に切符を買った場合 通しで切符を買った場合
東京 → 越後湯沢(3410円)
越後湯沢→長岡(1340円)
合計:4750円
東京 → 長岡(4780円)
合計:4840円(90円損)

なんと、分割で買った場合90円ですが安くなります。しかし、分割で購入した場合だと越後湯沢~長岡は100km超えないため途中下車できません。例えば青島食堂に寄るため長岡駅の隣の宮内駅で途中下車というのはできないのでご注意を。どんな方法で購入するかを考えて、最適な選択をしましょう!

2025年3月29日土曜日

Excelでできるプログラミング!初心者向けVBA入門講座 by裏方徹也

Excelでできるプログラミング!初心者向けVBA入門講座

Excelでできるプログラミング!初心者向けVBA入門講座

実行結果

★はじめに

皆さん、Excelを普段どのように使っていますか?
Excelは、集計や計算を簡単に行える強力なツールですが、実はプログラミングもできるのをご存知ですか?
今回は、Excelに備わっている「VBA(Visual Basic for Applications)」という機能を使って、Excelで自動化する方法をご紹介します!

VBAを使うことで、関数では手に負えない複雑な作業や、毎日同じような処理を自動化して効率化できるんです。
さっそく、Excelでのプログラミングに挑戦してみましょう!

手順1: VBAエディタを開く

まず最初に、Excelで「開発」タブを表示させます。このタブはデフォルトでは表示されていないかもしれませんが、表示方法を簡単に説明しますね。

Excelを開き、「ファイル」タブから「オプション」を選択します。

「リボンのユーザー設定」をクリックし、「開発」にチェックを入れてOKを押します。

これで「開発」タブが表示されるようになります。次に、開発タブをクリックし、「Visual Basic」を選択します。

これで、VBAコードを編集するためのエディタが開きます。この画面がVBAの作業場所となります。

手順2: 新しいコードを追加する

VBAエディタが開いたら、次にシートを選び、コードを入力していきます。
左側の「VBAProject」ウィンドウから、「Sheet1」をクリックします。

新しいコードを追加するために、以下のコードをそのままコピーして、VBAエディタに貼り付けてください。

Sub Macro1() Dim CTR As Integer Dim Tanto As Variant Dim TantoIndex As Integer ' 担当者リスト Tanto = Array("でべそ", "清盛", "裏方") TantoIndex = 0 Do Until Range("A2").Offset(CTR, 0).Value = "" If Range("B2").Offset(CTR, 0).Value = "土" Or Range("B2").Offset(CTR, 0).Value = "日" Then Else Range("C2").Offset(CTR, 0).Value = Tanto(TantoIndex Mod 3) TantoIndex = TantoIndex + 1 End If CTR = CTR + 1 Loop End Sub

このコードでは、1ヶ月分の戸川商店のシフトを月曜日から金曜日まで、
「でべそ」「清盛」「裏方」の順番で自動的に割り当てる仕組みを作成しています。
関数を使うよりも、こうしたプログラムの方が簡単に自動化できることがわかりますね!

手順3: コードを実行する

コードを入力したら、実際に実行してみましょう。

エディタ上部の「実行」ボタンをクリックするか、F5キーを押します。

すると、Excelのシートに自動的にシフトが割り当てられます。

実行結果

結果として、シート上に月曜日から金曜日の各日に、「でべそ」「清盛」「裏方」が順番に割り当てられます。
こうすることで、手作業でシフトを入力する手間が省け、時間を大幅に節約できます。

★まとめ

Excelはただの集計ツールではありません。VBAを使えば、複雑な処理や毎日の作業を自動化することができます。
今回ご紹介したシフト割り当ての例のように、VBAを活用することで、手間がかかる作業を簡単にこなすことができるんです。

VBAをマスターすることで、Excelをさらに活用し、業務の効率化が図れるようになります。
ぜひ、今回の手順を参考にして、Excelでのプログラミングに挑戦してみてください!

2025年3月27日木曜日

Pythonで簡単にできる自動モザイク処理と動画編集方法(第3.5回) by裏方徹也

Pythonで簡単にできる自動モザイク処理と動画編集方法(第3.5回)

Pythonで簡単にできる自動モザイク処理と動画編集方法(第3.5回) by裏方徹也

皆さん、こんにちは!裏方です!
前回は動画に映っている人物をMask R-CNNという方法で検出し、四角でマーキングする方法を紹介しました。
本来そこでモザイクのかけかたのコードを紹介するところでしたが、説明を失念したため、今回ご紹介します!

1. 今回の記事で扱うモザイクについて

モザイクと言えば、通常は以下のような形をイメージすることが多いかもしれません。

モザイクの画像

しかし、この方法ではどうしても動画に集中しづらくなる場合もあります。
そこで、この記事では以下のような「ぼかし」処理を使用して、人物が誰なのか分からないようにします。

ぼかし処理後の画像

モザイクよりも視覚的に不自然さが少なく、見やすくなったかと思います。

2. 追加するコードについて

それでは、実際にPythonでモザイクをかけるためのコードを追加していきます。
まず、以下のコードを draw_box(frame, boxes, scores) 関数内に追加してください。

# まず、ぼかしをかける範囲を切り出す
region = frame[int(y1):int(y2), int(x1):int(x2)]

# ガウスぼかしを適用 (ksizeはぼかしの強さを決定)
blurred_region = cv2.GaussianBlur(region, (45, 45), 20)

# ぼかしをかけた結果を元のフレームに戻す
frame[int(y1):int(y2), int(x1):int(x2)] = blurred_region

このコードを挿入することで、Mask R-CNNで検出した人物の周辺にぼかし処理を適用できます。
具体的には、検出した座標を基にその領域にガウスぼかしをかけます。

3. 処理内容

ここでは、コードがどのように動作するかを説明します。

  1. 人物検出
    Mask R-CNNを使用して動画内の人物を検出し、その座標x1, y1, x2, y2を取得します。
  2. ぼかし処理
    検出された人物の領域(座標で切り取られた部分)に対してガウスぼかしを適用します。 ぼかしの強さは、cv2.GaussianBlur(region, (45, 45), 20)の 45の部分、20の部分を適宜調節してください。 細かい説明は省きますが、 値が高ければ高い程ぼかしが強くなりわかりにくくなるというイメージです。
  3. 元の動画に反映
    ぼかし処理をかけた領域を、元のフレームに戻すことでモザイク処理を実現します。

4. 実行結果

実際にこの処理を適用した結果がこちらです:

実行前



実行後




上記のように、人物にぼかしが適用され、誰なのか特定できないようになりました。これで、プライバシーを守りつつ、動画の内容をそのまま活かすことができます。

5. 全体のコード

ここで紹介したコードを含む全体のコードは以下のようになります:



import tkinter as tk
from tkinter import filedialog
import cv2
import moviepy.editor as mp
import os
import time
# 第3回で追加#
import torch
from torchvision import models, transforms # ここでmodelsをインポート
#第3回で追加#
import numpy as np

#第3回で追加#
model = models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)
model.eval()  # 評価モードにする
#第3回で追加#

# ファイルダイアログで動画を選択
def select_video_file():
    root = tk.Tk()
    root.withdraw()  # Tkinterウィンドウを非表示にする
    video_path = filedialog.askopenfilename(title="動画ファイルを選択", filetypes=[("動画ファイル", "*.mp4 *.avi *.mov *.mkv")])
    return video_path

# 動画の音声と映像を出力
def process_video(input_video_path):
    # 中間ファイル作成(映像だけ出力)
    output_video_path_temp = input_video_path.rsplit('.', 1)[0] + "_outputtemp.mp4"

    # 出力ファイルのパスを生成(元の動画と同じディレクトリにoutput.mp4として保存)
    output_video_path = input_video_path.rsplit('.', 1)[0] + "_output.mp4"


    # 動画キャプチャの準備
    cap = cv2.VideoCapture(input_video_path)
    original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)

    # 総フレーム数を取得
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 出力動画ファイルの作成(音声なしで映像のみ)
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path_temp, fourcc, fps, (original_width, original_height))

    frame_count = 0

    start_time = time.time()


    # 第3回で追加#
    # 500x500の全画面黒い画像を作成
    black_image = np.zeros((500, 500, 3), dtype=np.uint8)

    # Faster R-CNNを使用して、黒い画像上で検出処理を行う
    boxes, scores = process_torch(black_image)  # process_torchの適用
    # 第4回で追加#


    while True:
        # 動画の1フレームを読み込む
        ret, frame = cap.read()
        if not ret:
            break  # 動画の終わりに達したら終了

        #第3回で追加
        if 65 < frame_count < 255:

            if frame_count % 3 == 0:
                boxes , scores = process_torch(frame) #Fasterでframeから人を検知する

        frame = draw_box(frame,boxes , scores)


        #フレーム番号
        #frame = writeinfo(frame, frame_count, original_width, original_height)
        # 目盛りを描画
        #frame = add_scale_to_frame(frame, original_width, original_height)



        frame_count += 1  # フレーム番号をインクリメント
        out.write(frame)

        cv2.imshow("frame", frame)
        cv2.waitKey(1)

    # 動画キャプチャと書き込みを解放
    cap.release()
    out.release()
    cv2.destroyAllWindows()

    end_time = time.time() - start_time
    end_time_m = end_time / 60
    end_time_s = end_time % 60

    print(f"処理時間: {end_time_m} 分 {end_time_s}")

    # 動画と音声をそのまま出力
    add_audio_to_video(input_video_path, output_video_path_temp,output_video_path, total_frames,fps)

    print(f"出力ファイル: {output_video_path}")

##第3回で追加##
def process_torch(frame):

    input_image = preprocess_image(frame)

    with torch.no_grad():
        prediction = model(input_image)

    boxes = prediction[0]['boxes'].cpu().numpy()
    scores = prediction[0]['scores'].cpu().numpy()

    return boxes,scores

def preprocess_image(image):
    transform = transforms.Compose([
        transforms.ToTensor(),  # 画像をテンソルに変換
    ])
    return transform(image).unsqueeze(0)  # バッチ次元を追加


def draw_box(frame,boxes , scores):
    # 信頼度が一定値以上の検出結果に四角形を描画
    threshold = 0.9  # 信頼度の閾値(必要に応じて調整)
    for i in range(len(boxes)):
        if scores[i] > threshold:

            x1, y1, x2, y2 = boxes[i]

            #3.5回追加
            # まず、ぼかしをかける範囲を切り出す
            region = frame[int(y1):int(y2), int(x1):int(x2)]


            # ガウスぼかしを適用 (ksizeはぼかしの強さを決定)
            blurred_region = cv2.GaussianBlur(region, (45, 45), 20)

            # ぼかしをかけた結果を元のフレームに戻す
            frame[int(y1):int(y2), int(x1):int(x2)] = blurred_region
            #3.5回で追加


            # 四角形を描画 (色は青、太さは2)
            #cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)

            # scoreを丸める (小数第2位以下を切り捨て)
            #scores_M = int(scores[i] * 1000) / 1000

            # 黒い文字でframe_countを表示
            #cv2.putText(frame, f"{scores_M}", (int(x1), int(y1)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)

    return frame
##第3回で追加##

##第2回で追加##
def writeinfo(frame,frame_count,width,height):
    # フレームにframe_countを表示
    # 白い背景の矩形を描画
    cv2.rectangle(frame, (0, 0), (100, 40), (255, 255, 255), -1)

    # 黒い文字でframe_countを表示
    cv2.putText(frame, f"{frame_count}", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)

    return frame

def add_scale_to_frame(frame, width, height, scale_interval=100, large_scale_interval=500):
    # 左端と上端に目盛りを描画
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 0.5
    font_thickness = 1
    text_color = (0, 0, 0)
    red_color = (0, 0, 255)  # 赤色
    green_color = (0, 255, 0)  # 緑色

    # 左端(縦の目盛り)
    for y in range(scale_interval, height, scale_interval):
        cv2.line(frame, (0, y), (10, y), (0, 0, 0), 2)  # 目盛りの線
        cv2.putText(frame, str(y), (15, y + 5), font, font_scale, text_color, font_thickness, cv2.LINE_AA)  # 数値

    # 上端(横の目盛り)
    for x in range(scale_interval, width, scale_interval):
        cv2.line(frame, (x, 0), (x, 10), (0, 0, 0), 2)  # 目盛りの線
        cv2.putText(frame, str(x), (x + 5, 20), font, font_scale, text_color, font_thickness, cv2.LINE_AA)  # 数値

    # 100ピクセルごとの交点に赤い点を描画
    for x in range(scale_interval, width, scale_interval):
        for y in range(scale_interval, height, scale_interval):
            cv2.circle(frame, (x, y), 3, red_color, -1)  # 赤い点
            cv2.putText(frame, f"({x},{y})", (x + 5, y + 10), font, font_scale, red_color, font_thickness, cv2.LINE_AA)  # 座標表示

    # 500ピクセルごとの交点に緑の点を描画
    for x in range(large_scale_interval, width, large_scale_interval):
        for y in range(large_scale_interval, height, large_scale_interval):
            cv2.circle(frame, (x, y), 3, green_color, -1)  # 緑の点
            cv2.putText(frame, f"({x},{y})", (x + 5, y + 10), font, font_scale, green_color, font_thickness, cv2.LINE_AA)  # 座標表示

    return frame
##第2回で追加##


# 音声を動画に統合する
def add_audio_to_video(input_video_path, output_video_path_temp,output_video_path, total_frames,fps):
    #moviepyで動画と音声を読み込む
    video_clip = mp.VideoFileClip(input_video_path)
    audio_clip = video_clip.audio

    # 映像部分の長さと音声の長さが一致するように、音声を調整
    duration = total_frames / fps  # 映像の長さ(秒)
    audio_clip = audio_clip.subclip(0, duration)  # 音声を映像の長さに合わせる


    # 映像と音声を統合
    final_video = mp.VideoFileClip(output_video_path_temp)
    final_video = final_video.set_audio(audio_clip)

    # 音声付きの動画を保存
    final_video.write_videofile(output_video_path, codec="libx264", audio_codec="aac")

    # 中間ファイル(output_video_path)を削除
    if os.path.exists(output_video_path_temp):
        os.remove(output_video_path_temp)
        print(f"中間ファイル {output_video_path_temp} を削除しました。")

    print(f"音声付きの動画が保存されました。最終ファイル名: {output_video_path_temp}")


# メイン処理
def main():
    video_file = select_video_file()
    if video_file:
        process_video(video_file)
    else:
        print("動画ファイルが選択されませんでした。")

if __name__ == "__main__":
    main()

このコードを使用することで、Mask R-CNNを利用して簡単にモザイクをかけることができます。

6. 問題点と改善方法

実際に使ってみると、いくつかの問題点が浮かび上がります。

  1. 人物全体にモザイクがかかってしまう
    現在、モザイクは人物全体にかかってしまいます。顔や特定の部位だけにモザイクをかけたい場合、顔認識などを追加することで改善できます。
  2. 処理時間がかかる
    モザイク処理には時間がかかる場合があります。前回の記事でもお伝えした通り、全てのフレームに対して行っており莫大な時間がかかってしまいます。対策として一定間隔のフレームで実行することで処理時間を短くできます。

7. まとめ

今回は、PythonとMask R-CNNを使用して動画内の人物にモザイクをかける方法を紹介しました。
この方法を使えば、簡単にプライバシーを保護しながら、自然な形でモザイク処理ができます。
さらに、顔検出や並列処理を組み合わせることで、より精度を上げることも可能です。

もし、この記事が役に立ったなら、コメント欄で教えてください!
また、他の記事でもPythonを使った実践的なチュートリアルを紹介していますので、ぜひチェックしてみてください。

2025年3月22日土曜日

オフ会前に行きたい!D-channel聖地巡り3選と撮影スポット by裏方徹也 時折でべそ加筆

D-Channelのオフ会5月4日(日)に開催されることになりましたね!
楽しみにしているファンの皆さんも多いはず!
もし、オフ会前に少し時間ができたなら、是非その時間をD-Channelの撮影地巡りに使ってみてはいかがでしょうか?
今回は、オフ会に参加する前に訪れたいD-Channelファン必見の聖地3選を紹介します。撮影スポットを巡りながら、
D-Channelの世界に浸り、オフ会へのワクワク感をさらに高めましょう!

1. 新宿
新宿にはD-Channelの撮影地がいくつあります。
特にファンなら見逃せない何か所か紹介します。

【新宿中央公園】
D-Channelファンならお馴染みのこの公園は1年目の頃から撮影している歴史深い場所。
清盛さんが30歳の誕生日企画で千葉県柏市から新宿までチャリで数10キロ走る動画のゴール地点です。
また、ビビデバを踊った場所や、菓子パンの早食いハンデマッチの撮影を行いました。





アクセス:都営大江戸線「都庁前駅」から徒歩5分
おすすめの過ごし方:公園を散策しつつ、動画のシーンを思い出しながら楽しんでみてください。特に「ナイアガラの滝」と呼ばれる滝の裏手にはたくさんの亀が放し飼いされており都会の喧騒に疲れた心を癒してくれます。

【かめ屋(新宿)】
かき揚げそばで有名なこの店は、でべそが訪れた場所としても知られています。
サクサクしたかき揚げとあっさりしただしが絶品!
24時間営業してますが訪れるなら混雑を避けるため早朝に行くのがおすすめです。



アクセス:JR新宿駅西口or東口から徒歩5分
おすすめメニュー:かき揚げそば。地元でも評判の味を堪能しましょう。

【ロッテリア新宿小田急エース店】
こちらは新宿駅の中にあるロッテリア。
こちらでは1年目のころ、でべそとドリルが「ポテト食べ放題」に釣られて胃袋の限界に挑んだ場所です。
現在頻繁に行っている「だんまりグルメ」の原型がここで始まったと言っても過言ではありません。



アクセス:新宿駅西口から徒歩5分
おすすめメニュー:ポテトを頼む際口頭でケチャップを付ける事が出来ます。




2. 中野
中野にもD-Channelファン必見の撮影地があります。
ここでは、あの名シーンが撮影された場所を巡りましょう。

【中野サンプラザ】
中野サンプラザは、閉館翌日の様子を撮影した動画の撮影地です
現在は外観のみが見られますが、その歴史的な背景を感じながら訪れる価値があります。



アクセス:JR中野駅北口から徒歩3分
おすすめポイント:建物周囲の柵越しに、でべそさんが思い出を呟いていたシーンを思い出しながら過ごしてみて。

【デイリーチコ】
だんまりグルメシリーズで「8段アイスクリーム」を苦悶の表情ででべそさんが食べるシーンを撮った場所!
アイスが溶けて床にこぼしてしまうハプニングもありましたが、
ファンなら一度は挑戦したいスポット。
もちろん、通常サイズのアイスも楽しめます。



アクセス:JR中野駅北口から徒歩5分
おすすめメニュー:8段アイスクリームに挑戦してみよう!中野ブロードウェイの地下にあるので迷子に注意!

【平和の森公園】
D-channelを開設して一発目に撮影した地!以前所属していたMEGWIN TVでも御用達の場所でした。
数年前にリニューアルして雰囲気は少し変わりましたが、
懐かしの動画を味わうならココがおすすめです!

アクセス:JR中野駅北口から徒歩20分、西武新宿線沼袋駅から徒歩8分
おすすめポイント:広々とした芝生があるのでそこでのんびりすると嫌なことも忘れたり忘れなかったり?
注意:この中野区のほかにも大田区という神奈川寄りのほうにも「平和の森公園」があるのでお間違えのないように。昔、アトリエ半蔵も間違えてそっちに行ったことがあります。



3. 浅草
最後に紹介するのは願いが叶うかもしれない聖地。
ここにも、D-Channelの企画が実際に行われたスポットがあります。

【瓦割りのカワラナ】
清盛さんが30歳の誕生日企画で瓦割りに挑戦したお店。
店主によれば、瓦を割ることで願い事が叶うとのこと。
D-Channelファンなら、ぜひ一度訪れてその特別な体験をしてみましょう。



アクセス:つくばエクスプレス「浅草駅」から徒歩5分
おすすめ体験:願い事を込めて瓦割りをしてみましょう!但し平日は営業してないので注意!

★まとめ
今回は、オフ会前に訪れるべきD-Channelの撮影地を3つご紹介しましたが、蒲田のタイヤ公園や吉祥寺の井の頭公園など、まだまだ他にもたくさんあります。
どのスポットもD-channelの世界観を感じることができ、
オフ会の期待感をさらに高めてくれること間違いなしです!
訪れた際は、動画を見ながらその思い出を一層深めて、オフ会でのリアルな交流を最大限に楽しみましょう。
さあ、聖地巡りをして、素晴らしい思い出を作ってください。
そして、オフ会お待ちしております!

2025年3月15日土曜日

【ホワイトデーを盛り上げる!必見ユニーク動画3選】 by裏方徹也

★はじめに
ホワイトデー、皆さんはどんなふうに過ごしていますか?
特別な計画がある方もいれば、何も予定がない方もいるかもしれません。
私はというと…特に何もありませんでした(笑)。
そんな時こそ、楽しい動画を観てリラックスした時間を過ごすのが一番!
今回は、ホワイトデーにぴったりのユニークな動画を厳選してご紹介します。
ちょっとした息抜きや、ホワイトデーの気分を盛り上げるための動画をぜひチェックしてみてください。

★白い泥の大爆笑!思わず笑ってしまうホワイトデイの動画



最初にご紹介するのは、ホワイトデーにぴったりのユニークな動画、「ホワイトデイ」。
でべそさんが突然顔が泥だらけになり、襲撃されるというシーンが衝撃的です!
一体なぜ顔だけ泥だらけなのか?その理由は動画を見ればすぐにわかります。
ホワイトデーだからこその"ホワイト"泥(デイ)というユニークな発想に、
思わず笑ってしまうこと間違いなし!軽い気持ちで見て、心の底から笑いたい方にはぴったりの動画です。


★でべそさんと裏方が作る!手作りチョコの裏側を大公開



次におすすめするのは、ホワイトデーにぴったりな「手作りチョコ」の動画です。
もともとは清盛さんが主役の企画だったのですが、
急遽風邪で欠席し、でべそさんと裏方の2人でチョコ作りに挑戦!
実際に作業したときの苦労や予期せぬハプニングもあって、
視聴者も思わず応援したくなること間違いなし。
特に、永遠に鍋をかき混ぜる作業や、腕がしんどくなるシーンは、
手作りチョコに挑戦したことがある人には共感できる部分が多いかもしれません。
お返しのチョコを自作したい方には参考にもなるので、ぜひ見てみてください。



★でべそさん、45秒で何ができる?



最後にご紹介するのは、「45秒チャレンジ」に挑戦するでべそさんの動画です。
ホワイトデーにちなんだユニークなチャレンジ内容となっており、
わずか45秒でどんな結果が待っているのか?!
その結果に、観ているこちらもハラハラドキドキ!「ホワイトデーをもっと楽しみたい!」という方には、
ちょっとしたスリルと笑いを提供してくれる動画です。
45秒という短い時間でどんなサプライズが待っているのか、ぜひ最後までチェックしてみてください。



★まとめ
今回は、ホワイトデーにぴったりな動画を3本ご紹介しました。
どの動画もユニークで楽しい内容ばかりなので、
ぜひホワイトデーを盛り上げるために観てみてください。
普段の疲れを癒したり、笑ったりすることができるので、
素敵なホワイトデーの過ごし方の参考になるかもしれませんよ!
少し変わったホワイトデーを楽しみたい方にぴったりな動画を選びました。
ぜひ、チェックしてみてくださいね。

2025年3月11日火曜日

切符の紛失はご注意!再収受証明について by裏方徹也

 ★はじめに
 

先日のショート動画ででべそがにやにやとして切符を見せていました。
何が起きたのかわからない方もいたと思います。
そこで今回はでべその身に何があったのか旅行大好き裏方徹也が解説します。

★切符をよく見てみると



切符をよく見ると「再収受証明」という文字が見えます。
「再収受証明」とは、切符を失くしてしまい、
再度買い直した切符を使ったときに、
降車駅でその旨を駅員さんに申し出ることで受けられる証明のことです。
この証明を受けると、使用日の1年以内に失くした切符が見つかった場合、
手数料220円(指定席券の場合は340円)を差し引かれた金額が手元に戻ってきます。
今回のでべその場合、東京都区内→長岡まで乗車券:4,840円、自由席特急券:3,740円なので、
紛失後に1年以内に見つかった場合、手数料が差し引かれた乗車券4,620円、自由席特急券:3,520円が手元に戻ってきます。

★結論
でべそは切符を失くして余計な出費が出てしまった事が失態であることを伝えたかったようです。
もし、万が一切符を失くしてしまった場合、
降車駅で駅員さんに申告して買い直してください。申告する際にはどの電車の何号車のどこに座っていたかも伝えると良いです。
1年以内に失くした切符を探しだしてください。

★おまけ
ちなみに裏方は動画を見た当初切符をなくしたことに気づかず、
紛失した以外に失態した要因があるのでは?と考えました。
それは、長岡まで週末パスを使わなかったことです。
週末パスとは8,880円で土日でJR東日本(青森、秋田、岩手以外)の
管内と一部第三セクターが乗り放題になるフリーパスがあります。
新幹線、特急に乗るときは特急券を買えば乗車券として使用できます。
その券を使わなかったために余計な出費が出てしまったのではと考えていました。
東京~長岡は往復で9,680円ですが、週末パスを使うと8,880円と800円安く行ける上、
例えば足を延ばして新潟に行くとか長岡の近くを走る第三セクターのほくほく線に乗る事もできます。
でべそさんのわかる人にはわかるというヒントを深く考え過ぎてミスリードしてしまいました笑


2025年3月5日水曜日

Pythonで簡単にできる自動モザイク処理と動画編集方法(第3回) by裏方徹也

【初心者向け】動画処理と人物検出の基本!Mask R-CNNを使って動画から人物を自動検出する方法 第3回

【初心者向け】動画処理と人物検出の基本!Mask R-CNNを使って動画から人物を自動検出する方法 第3回

皆さん、こんにちは!裏方です!第1回では、Eclipseの導入から動画を単純に出力する方法を紹介し、第2回では、動画にフレーム番号や座標を表示する技術を紹介しました。そして今回は、さらに進んで、動画に映っている人物をMask R-CNNという方法で検出し、四角でマーキングする方法を紹介します。

目次

1. Mask R-CNNとは?

Mask R-CNNとは、簡単に言うと画像から物体を自動で検出する技術です。ここでは動画の中から人物という物体を検出するために使います。もっとわかりやすくするため、ウォーリーを探せで今回のプログラムを説明します。ウォーリーを探せでは、ウォーリーという人物の特徴を記憶して、絵の中から探し出しますよね。絵を1枚ずつ見て見つけ出しますが、今回のプログラムではウォーリーだけではなく、何千人、何万人の人の画像を記憶して動画からその画像に近しい人を探してきてくれます。しかも、1枚の画像だけではなく、何百枚、何千枚の画像の中から人物を自動で見つけだしてくれます。

2. 必要なライブラリの準備

それでは、今回追加するコードを見てみましょう。Mask R-CNNを使うために必要なモデルのロードや画像の前処理を行います。

import torch
from torchvision import models, transforms

# 事前学習済みのMask R-CNNモデルをロード
model = models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)
model.eval()  # 評価モードにする
                

この部分では、Mask R-CNNモデルをPyTorchのTorchvisionライブラリからロードし、評価モードに設定しています。要は大量の人の画像を記憶させ、動画の中からそれに近いものを検出します。検出された物体はどれくらい人に近いのかスコアという点数をつけて評価します。1に近ければ近いほど検出したものが人に近いです。これで、人物検出を始める準備が整いました。

3. 動画から人物を検出して四角形を描画

次に、実際に動画の中から人を探しだしてみます。

def process_torch(frame):
    input_image = preprocess_image(frame)
    with torch.no_grad():
        prediction = model(input_image)
    boxes = prediction[0]['boxes'].cpu().numpy()
    scores = prediction[0]['scores'].cpu().numpy()
    return boxes, scores

def preprocess_image(image):
    transform = transforms.Compose([transforms.ToTensor()])
    return transform(image).unsqueeze(0)  # バッチ次元を追加

def draw_box(frame, boxes, scores):
    threshold = 0.9  # 信頼度の閾値
    for i in range(len(boxes)):
        if scores[i] > threshold:
            x1, y1, x2, y2 = boxes[i]
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
            scores_M = int(scores[i] * 1000) / 1000
            cv2.putText(frame, f"{scores_M}", (int(x1), int(y1)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)
    return frame
                

・物体の検出 (process_torch)

入力された動画を1枚ずつ処理し、物体の位置(四角形)とそのスコアを取得します。この結果を使って、どの物体が検出されたのかを確認できます。

・画像の前処理 (preprocess_image)

画像を「テンソル」という形式に変換し、物体検出モデルが正しく処理できる形に整えます。テンソルとは多次元の配列の事で簡単に言うと「数字が並んだ箱」の事です。

・物体の描画 (draw_box)

検出された物体の位置に四角形を描き、その四角の左上にスコアを表示します。これにより、どの物体がどれくらい信頼できるかを視覚的に確認できます。

  

4. コード全体

以下は、今回のコード全体です。

import tkinter as tk
from tkinter import filedialog
import cv2
import moviepy.editor as mp
import os

#第3回で追加#
import torch
from torchvision import models, transforms
#第3回で追加#

#第3回で追加#
# 事前学習済みのMask R-CNNモデルをロード
model = models.detection.maskrcnn_resnet50_fpn_v2(pretrained=True)
model.eval()  # 評価モードにする
#第3回で追加#

# ファイルダイアログで動画を選択
def select_video_file():
    root = tk.Tk()
    root.withdraw()  # Tkinterウィンドウを非表示にする
    video_path = filedialog.askopenfilename(title="動画ファイルを選択", filetypes=[("動画ファイル", "*.mp4 *.avi *.mov *.mkv")])
    return video_path

# 動画の音声と映像を出力
def process_video(input_video_path):
    # 中間ファイル作成(映像だけ出力)
    output_video_path_temp = input_video_path.rsplit('.', 1)[0] + "_outputtemp.mp4"

    # 出力ファイルのパスを生成(元の動画と同じディレクトリにoutput.mp4として保存)
    output_video_path = input_video_path.rsplit('.', 1)[0] + "_output.mp4"


    # 動画キャプチャの準備
    cap = cv2.VideoCapture(input_video_path)
    original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)

    # 総フレーム数を取得
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 出力動画ファイルの作成(音声なしで映像のみ)
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path_temp, fourcc, fps, (original_width, original_height))

    frame_count = 0

    while True:
        # 動画の1フレームを読み込む
        ret, frame = cap.read()
        if not ret:
            break  # 動画の終わりに達したら終了

        if 65 < frame_count < 215:
            boxes , scores = process_torch(frame) #Fasterでframeから人を検知する
            frame = draw_box(frame,boxes , scores)

        #フレーム番号
        frame = writeinfo(frame, frame_count, original_width, original_height)
        # 目盛りを描画
        frame = add_scale_to_frame(frame, original_width, original_height)

        frame_count += 1  # フレーム番号をインクリメント
        out.write(frame)

        cv2.imshow("frame", frame)
        cv2.waitKey(1)

    # 動画キャプチャと書き込みを解放
    cap.release()
    out.release()
    cv2.destroyAllWindows()

    # 動画と音声をそのまま出力
    add_audio_to_video(input_video_path, output_video_path_temp,output_video_path, total_frames,fps)

    print(f"出力ファイル: {output_video_path}")

##第3回で追加##
def process_torch(frame):

    input_image = preprocess_image(frame)

    with torch.no_grad():
        prediction = model(input_image)

    boxes = prediction[0]['boxes'].cpu().numpy()
    scores = prediction[0]['scores'].cpu().numpy()

    return boxes,scores

def preprocess_image(image):
    transform = transforms.Compose([
        transforms.ToTensor(),  # 画像をテンソルに変換
    ])
    return transform(image).unsqueeze(0)  # バッチ次元を追加


def draw_box(frame,boxes , scores):
    # 信頼度が一定値以上の検出結果に四角形を描画
    threshold = 0.9  # 信頼度の閾値(必要に応じて調整)
    for i in range(len(boxes)):
        if scores[i] > threshold:
            x1, y1, x2, y2 = boxes[i]
            # 四角形を描画 (色は青、太さは2)
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)

            # scoreを丸める (小数第2位以下を切り捨て)
            scores_M = int(scores[i] * 1000) / 1000

            # 黒い文字でframe_countを表示
            cv2.putText(frame, f"{scores_M}", (int(x1), int(y1)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)

    return frame
##第3回で追加##

##第2回で追加##
def writeinfo(frame,frame_count,width,height):
    # フレームにframe_countを表示
    # 白い背景の矩形を描画
    cv2.rectangle(frame, (0, 0), (100, 40), (255, 255, 255), -1)

    # 黒い文字でframe_countを表示
    cv2.putText(frame, f"{frame_count}", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)

    return frame

def add_scale_to_frame(frame, width, height, scale_interval=100, large_scale_interval=500):
    # 左端と上端に目盛りを描画
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 0.5
    font_thickness = 1
    text_color = (0, 0, 0)
    red_color = (0, 0, 255)  # 赤色
    green_color = (0, 255, 0)  # 緑色

    # 左端(縦の目盛り)
    for y in range(scale_interval, height, scale_interval):
        cv2.line(frame, (0, y), (10, y), (0, 0, 0), 2)  # 目盛りの線
        cv2.putText(frame, str(y), (15, y + 5), font, font_scale, text_color, font_thickness, cv2.LINE_AA)  # 数値

    # 上端(横の目盛り)
    for x in range(scale_interval, width, scale_interval):
        cv2.line(frame, (x, 0), (x, 10), (0, 0, 0), 2)  # 目盛りの線
        cv2.putText(frame, str(x), (x + 5, 20), font, font_scale, text_color, font_thickness, cv2.LINE_AA)  # 数値

    # 100ピクセルごとの交点に赤い点を描画
    for x in range(scale_interval, width, scale_interval):
        for y in range(scale_interval, height, scale_interval):
            cv2.circle(frame, (x, y), 3, red_color, -1)  # 赤い点
            cv2.putText(frame, f"({x},{y})", (x + 5, y + 10), font, font_scale, red_color, font_thickness, cv2.LINE_AA)  # 座標表示

    # 500ピクセルごとの交点に緑の点を描画
    for x in range(large_scale_interval, width, large_scale_interval):
        for y in range(large_scale_interval, height, large_scale_interval):
            cv2.circle(frame, (x, y), 3, green_color, -1)  # 緑の点
            cv2.putText(frame, f"({x},{y})", (x + 5, y + 10), font, font_scale, green_color, font_thickness, cv2.LINE_AA)  # 座標表示

    return frame
##第2回で追加##


# 音声を動画に統合する
def add_audio_to_video(input_video_path, output_video_path_temp,output_video_path, total_frames,fps):
    #moviepyで動画と音声を読み込む
    video_clip = mp.VideoFileClip(input_video_path)
    audio_clip = video_clip.audio

    # 映像部分の長さと音声の長さが一致するように、音声を調整
    duration = total_frames / fps  # 映像の長さ(秒)
    audio_clip = audio_clip.subclip(0, duration)  # 音声を映像の長さに合わせる


    # 映像と音声を統合
    final_video = mp.VideoFileClip(output_video_path_temp)
    final_video = final_video.set_audio(audio_clip)

    # 音声付きの動画を保存
    final_video.write_videofile(output_video_path, codec="libx264", audio_codec="aac")

    # 中間ファイル(output_video_path)を削除
    if os.path.exists(output_video_path_temp):
        os.remove(output_video_path_temp)
        print(f"中間ファイル {output_video_path_temp} を削除しました。")

    print(f"音声付きの動画が保存されました。最終ファイル名: {output_video_path_temp}")


# メイン処理
def main():
    video_file = select_video_file()
    if video_file:
        process_video(video_file)
    else:
        print("動画ファイルが選択されませんでした。")

if __name__ == "__main__":
    main()

                

5. 実行結果

実行前

実行前から実行後の変化をご覧ください。

実行後

6. 問題点

人を自動で検出できて便利である一方で以下のような問題点も存在します。

  • 処理に時間がかかる

まず、処理に時間がかかる点ですが、今回約150フレームを対象に処理してみたところ、処理が完了するまでに約9分かかりました。具体的には、1分間に約16.6フレーム分しか処理できないため、効率が悪く感じます。 たとえば今回の1万円チャレンジの動画のように30000フレームある場合、全て処理するのに約30時間近くかかってしまいます。このように、動画のフレーム数が多いと、処理時間が膨大になり、実用性に欠ける場合があります。

  • 全ての人がモザイクの対象となる

次に、全ての人がモザイクの対象となる点ですが、モザイクをかける人を選べないという事です。今回の動画では人込みででべそさん、清盛さんも映っている場合でも全員モザイクとなってしまいます。 でべそさん、清盛さん以外はモザイクをかけるといった指定が今のところできず、特定の人だけモザイクをかけないようにする場合には不便です。

7. まとめと次回予告

今回は、動画内の人物を検出し、四角でマーキングする方法を紹介しました。Mask R-CNNを使うことで、簡単に高精度な人物検出が可能となります。但し、動画の時間が長いと、処理に膨大な時間がかかるという問題点があるため、対策が必要となります。 次回は、一定間隔で人物を検出する方法について解説します。