[Day 27]用Django架构建置专属的LINEBOT吧 - 用LINE进行影片画面边缘侦测处理

介绍了图片讯息、音讯讯息、位置讯息处理的相关应用,
想说也趁这个机会来介绍一点关於影片处理的相关应用吧!

用LINE BOT处理用户传送的影片

比照之前所做的处理方法,
这边一样先将LINE用户端收到的影片储存成实体档案:

elif event.message.type=='video':
    video_content = line_bot_api.get_message_content(event.message.id)
    path='./static/video.mp4'
    with open(path, 'wb') as fd:
        for chunk in video_content.iter_content():
            fd.write(chunk)
    message.append(TextSendMessage(text='影片存档成功'))
    line_bot_api.reply_message(event.reply_token,message)

这样一来就能将影片讯息存成实体档案罗,

实际操作影片:

以cv2.Canny()进行影片边缘侦测处理

在OPENCV的套件中,cv2.Canny()是用来进行图片边缘侦测处理用的函数,
其中需要三个参数,第一个是要处理图片,
第二个跟第三个分别设定0-255之中的两个数值,
以作为边缘侦测的边缘筛选值,使用范例如下:

edges = cv2.Canny(image, threshold1, threshold2)

而我们要处理的影片,其实也可以将其分为一格一格的图片来进行处理,
首先我们以cv2.Canny()设定一个进行影片边缘侦测的函数:

#Video_Processing.py
import numpy as np 
import cv2 as cv 

image_path = './static/video_canny.jpg'
video_path = './static/video_canny.mp4'

def video_processing(path):
    cap = cv.VideoCapture(path)

    # 设定撷取影像的尺寸大小
    fourcc = 0x00000021
    FPS = 24
    w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    
    # 建立 VideoWriter 物件,输出影片至 './static/video_canny2.mp4'
    # FPS 值为 24, fourcc 为 0x00000021=>转mp4档案格式,w,h设定为原影片大小
    output = cv.VideoWriter(video_path,fourcc,FPS,(w,h))

    while(cap.isOpened()):
        ret, frame = cap.read()
        #以cv2.Canny()进行边缘侦测,threshold1及threshold2可依需求调整为0-255任一数
        canny = cv.Canny(frame,80,220)
        if ret == True:
            # 写入影格
            output.write(canny)

            cv.imshow('canny',canny)
            cv.imwrite(image_path,canny)
            #cv2.waitKey()中的参数单位是毫秒,代表每一张图片所停留的时间,一般设定为25
            if cv.waitKey(25) & 0xFF == ord('q'):
                break
        else:
            break
    return image_path , video_path

上面这段函数的处理步骤如下:
1.令cap变数为读取的影片,以cv2.VideoCapture(file)读取影片档案
2.以cap.get()获得原始图片的宽跟高
3.设定要输出的影片格式:(1)输出档案路径,(2)fourcc格式,(3)影片帧数(每秒几张图),(4)影片宽跟高
4.建立一个要输出的空白影片档案,范例是令为output变数
5.以cap.isOpened()来确认影像档案是否被开启,
6.以cap.read()读取影像档案的某一格画面frame,ret是回传是否捕捉成功,若成功则为true
7.以cv2.Canny()进行该画面边缘侦测,并且将侦测结果画面令为canny,
8.将canny加入准备好的空白影片output中,
9.将canny画面显示於电脑,并写入图片(作为影片缩图使用)
10.一个画面停留25毫秒,结束後继续捕捉下一个画面

依照这个流程,会将影片中的每个画面都进行一次cv2.Canny()处理,
再透过cv2.VideoWriter()拚凑成另一个影片,
以此类推,其实以同样的方式也能进行其他的图像处理应用,
这边就先作为简单的范例罗,

上面的函数设定完毕後,再将image_path , video_path return至views.py档案中,

#views.py
from IT_help.Video_Processing.py import *

......

elif event.message.type=='video':
    #撷取LINE用户端所传送的影片内容资讯
    video_content = line_bot_api.get_message_content(event.message.id)
    #设定影片档案存取路径与名称
    path='./static/video.mp4'
    #将内容写入实体影片档案
    with open(path, 'wb') as fd:
        for chunk in video_content.iter_content():
            fd.write(chunk)
    #获得缩图URL与影片URL
    image_path,video_path = video_processing(path)
    message.append(TextSendMessage(text='影片处理完毕'))
                    message.append(VideoSendMessage(original_content_url='https://'+domain+video_path[1:],preview_image_url='https://'+domain+image_path[1:]))
    line_bot_api.reply_message(event.reply_token,message)

这样就能将接收到的影片档案经过边缘侦测的处理後吐回给User端罗,
如果要将边缘侦测做得更细致,可以直接调整threshold参数,
用这个方法可以将每个画面经过将同处理并输出所需要的结果,
不妨将其他图像处理的方法都拿来试试看罗~

实际操作影片:

实际结果影片:


<<:  出生第31~34天 满月流水帐

>>:  mostly:functional 第二十七章:Applicative 的法则

Day30 ( 高级 ) 显示声波图形

显示声波图形 教学原文参考:显示声波图形 这篇文章会介绍,在 Scratch 3 里侦测麦克风的声音...

蓝底白字错误讯息

最近Windows Updata有列印问题KB5000802, 而我是用Chrome进1111人力银...

我们截至今天为止,总共在 firebase 上做了 168 次 A/B Testing

我跟男友开发这个聊天软件三年,刚刚回去算我们截至今天为止,总共在 firebase 上做了 168 ...

[Bonus 系列] - 和 useEffect 很像的 useLayoutEffect

这篇要补充一个比较少使用到的 useLayoutEffect hook,和 useEffect 语法...

[Day 28] 利用CreateML训练的模型判断情绪(上)

经过这两篇CreateML建立机器学习模型与如何提升判断准确度的教学相信大家都学会了该如何制作Cr...