OpenCV 이미지 작업 + Moviepy는 비디오 회전 및 중첩을 실현합니다.

☞ ░LaoYuanPython 블로그 https://blog.csdn.net/LaoYuanPython

I. 소개

" OpenCV-Python 일반적으로 사용되는 이미지 연산 : 더하기 , 빼기, 곱하기, 나누기, 확장 로그 및 비트 연산 "에서는 OpenCV의 주요 이미지 연산을 소개합니다. 동영상은 이미지 프레임으로 구성됩니다. OpenCV 및 Moviepy의 유연한 사용을 통해 몇 가지 특별한 연산을 수행 할 수 있습니다. 특수 효과. 이 기사에서는 OpenCV 이미지 연산 + Moviepy를 통해 비디오 중첩의 투명한 효과를 구현하는 방법을 소개합니다.

둘째, 프로그램이 실현됩니다.

이 사례는 회전하는 영상이나 회전하는 영상을 영상에 중첩 할 수있는 일반적인 방법을 구현하고, 콘텐츠 크기가 다른 두 영상의 중첩을 지원합니다. 중첩 된 객체를 그림으로 지원하기 위해서는 그림을 비디오로 변환해야하며, 그림의 표현 내용을 최대한 강조하기 위해 그림을 비디오로 변환하기 전에 그림의 배경색을 검정색으로 변환해야합니다.
관련 프로그램에는 다음 기능이 포함됩니다.

  1. adjustImgAccordingToRefImg : 프레임 생성 함수 get_frame에서 호출하는 하단 레이어 비디오의 크기를 참조하여 상위 레이어 비디오의 크기를 조정합니다.
  2. get_frame : 중첩해야하는 두 개의 비디오 프레임을 기반으로 결과 비디오 프레임을 생성하고, 생성시 상위 비디오 크기를 조정하려면 adjustImgAccordingToRefImg를 호출하십시오.
  3. ridPicBackground : convertPicToVideo에 의해 호출되는 그림의 배경색을 제거합니다.
  4. convertPicToVideo : 그림을 videoOverlyObjMask에서 호출하는 비디오로 변환합니다.
  5. videoOverlyObjMask : 오버레이 객체의 비디오와 해당 비디오를 오버레이하고 오버레이시 adjustImgAccordingToRefImg를 통해 기본 비디오 프레임 크기를 참조하여 상위 비디오 프레임 크기를 조정합니다.

위 함수의 주요 기능은 get_frame과 videoOverlyObjMask이며,이 두 함수는 비디오 회전 및 오버레이를위한 주요 프로그램 코드입니다. 관련 프로그램 코드는 다음과 같습니다.



def get_frame(level0Clip,level1Clip,t):
    """
    功能:根据两个大小不同的剪辑生成结果剪辑的帧
    :param level0Clip: 底层的剪辑,一般要求该剪辑的宽和高度不小于上层剪辑的宽和高,如果超过就只剪裁掉超出范围的边缘部分
    :param level1Clip: 上层剪辑,要求该剪辑为黑色的部分不能覆盖底层剪辑的图像
    :param t: 帧对应时刻
    :return: 新剪辑对应t时刻的合成帧,其图像为上层剪辑非透明部分叠加底层剪辑未被上层非透明部分覆盖部分
    """

    img1 = level0Clip.get_frame(t)
    img2 = level1Clip.get_frame(t)
    if img1.size!=img2.size:#如果两个剪辑大小不同
        img2 = adjustImgAccordingToRefImg(img2, img1) #根据底层剪辑的帧大小调整上层剪辑的大小,确保最终两个剪辑大小一致

    #取上层剪辑的非透明部分和底层剪辑未被覆盖部分
    imgGray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #将上层剪辑帧图像转成灰度图
    retval, imgMask = cv2.threshold(imgGray, 1, 255, type=cv2.THRESH_BINARY) #将灰度图二值化作为掩膜
    maskInv = cv2.bitwise_not(imgMask) #上层剪辑掩膜求反,用于获取底层剪辑需要显示内容
    result = cv2.bitwise_and(img2, img2, mask=imgMask) + cv2.bitwise_and(img1, img1, mask=maskInv)
    return result


def videoOverlyRotateObj(videoFName,objType='self',obj=None):
    """
    剪辑自身叠加一个该剪辑旋转的层,旋转层黑色的部分不能遮挡下层的剪辑内容
    :param videoFName: 剪辑来源视频文件
    :param objType、obj:
        self:剪辑自身叠加自身旋转内容,obj值忽略
        img:图片文件或图片矩阵对象,obj值为图片文件名会图片对象
        video:视频文件或剪辑,obj为视频文件名或剪辑对象
    :return: 参数视频剪辑自叠加一个旋转层对象,旋转层由参数objType、obj决定,对象大小最好小于videoFName对应视频大小,否则会被裁减
    """
    clip = VideoFileClip(videoFName, audio=True)
    if objType=='self':
        objClip = clip
    elif objType=='img':
        objClip = convertPicToVideo(obj, duration=clip.duration, createMask=False).set_fps(clip.fps)
    elif  objType=='video':
        if isinstance(obj,str): objClip = VideoFileClip(obj, audio=False)
        else: objClip = obj

    maskclip = objClip.rotate(angleF,expand=True).fx(vfx.resize,clip.size)

    make_frame = lambda t:get_frame(clip,maskclip,t)
    newclip = VideoClip( make_frame=make_frame,  duration=clip.duration).set_fps(clip.fps)

    return newclip

if __name__=='__main__':
    result1 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
    result1.write_videofile(r"F:\video\WinBasedWorkHard_new.mp4", threads=8)
    result2 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4")
    result2.write_videofile(r"F:\video\WinBasedWorkHard_mask_self.mp4", threads=8)
    result3 = videoOverlyRotateObj(r"F:\video\WinBasedWorkHard_src.mp4",'img',r'F:\pic\Lotus.JPG')
    result3.write_videofile(r"F:\video\WinBasedWorkHard_mask_pic.mp4", threads=8)
    result4 = videoOverlyRotateObj(r"F:\video\mydream.mp4", 'video',r"F:\video\WinBasedWorkHard_src.mp4")
    result4.write_videofile(r"F:\video\WinBasedWorkHard_mask_video.mp4", threads=8)

유료 란의 기사와 다르기 위해 기타 사소한 기능의 코드는 여기에서 제공하지 않습니다. 이 기사에서 해당하는 유료 컬럼 은 " OpenCV Image Operation + Moviepy를 사용하여 비디오 오버레이를 실현하는 경우 "입니다.

3. 케이스 효과

3.1. 관련 자료 소개

  • WinBasedWorkHard_src.mp4 : Zhou Xingchi의 "Love to fight to win"MV 비브라토 비디오
  • mydream.mp4 : Zhang Jianying의 "My Dream"비브라토 비디오
  • Lotus.jpg : 연꽃 그림
    여기에 사진 설명 삽입

3.2. 클리핑 및 자체 회전 클립 오버레이 효과

여기에 사진 설명 삽입

3.3 비디오 및 그림 구성의 회전 클립 오버레이

여기에 사진 설명 삽입

3.4. 클립 및 다른 회전 클립 오버레이 효과

여기에 사진 설명 삽입

네, 요약

이 기사에서는 OpenCV 이미지 작업 + Moviepy를 사용하여 비디오 오버레이를 달성하는 방법에 대해 자세히 설명하고, 최종 결과 클립의 상단 및 하단 클립이 중첩 된 후 상단 클립의 배경색이 하단 클립의 콘텐츠로 대체됩니다. 이 구현 사례의 도입을 통해 이미지 처리에서 OpenCV 이미지 작업의 역할을 이해하고이 방법을 사용하여 여러 편집 특수 효과에서 비디오 특수 효과를 만들 수 있습니다.

이 기사가 당신에게 도움이 될 수 있다고 생각한다면, 내가 좋아하고 좋아하는 것을 추가하도록 도와주세요, 감사합니다!

OpenCV-Python에 대한 자세한 내용은 "OpenCV-Python 그래픽 이미지 처리"
열 URL : https://blog.csdn.net/laoyuanpython/category_9979286.html을 참조하십시오.

자세한 동영상 소개 는 " PyQt + moviepy 오디오 및 비디오 편집 기사 디렉토리 "또는 " Moviepy 오디오 및 비디오 개발 칼럼 "을 참조하십시오. 이 두 열에 대한 지침은 " Python 오디오 및 비디오 클립 라이브러리 MoviePy1.0.3 중국어 자습서 가이드 및 실행 도구 다운로드 "를 참조하십시오.

이 기사에서 해당하는 유료 컬럼 은 " OpenCV Image Operation + Moviepy를 사용하여 비디오 오버레이를 실현하는 경우 "입니다.

오래된 원숭이에 대한 유료 열

Lao Yuan의 유료 칼럼 인 "Developing Graphical Interface Python Applications Using PyQt"( https://blog.csdn.net/laoyuanpython/category_9607725.html )는 Python 기반 PyQt 그래픽 인터페이스 개발을위한 기본 자습서와 유료 칼럼 "moviepy 오디오 및 비디오 개발"을 구체적으로 소개합니다. Column "( https://blog.csdn.net/laoyuanpython/category_10232926.html )에서는 moviepy 오디오 및 비디오 편집 및 합성 관련 방법과 관련 편집 및 합성 장면 처리를위한 관련 방법 사용에 대해 자세히 소개합니다. 두 열 모두 특정 기본 Python을 가지고 있지만 관련 지식이없는 초보 독자는 학습합니다.

유료 컬럼 기사 디렉토리 : "moviepy 오디오 및 비디오 개발 컬럼 기사 디렉토리"( https://blog.csdn.net/LaoYuanPython/article/details/107574583 ), "PyQt를 사용하여 그래픽 인터페이스 Python 애플리케이션 컬럼 디렉토리 개발"( https : // blog.csdn.net/LaoYuanPython/article/details/107580932 ).

Python 기초가 부족한 분들은 Lao Yuan의 무료 칼럼 인 "Column : Python Basic Tutorial Directory"( https://blog.csdn.net/laoyuanpython/category_9831699.html )를 통해 Python을 처음부터 배울 수 있습니다 .

Old Ape 독자를 지원하고 관심이 있으시면 유료 칼럼 구매를 환영합니다.

오래된 원숭이로부터 Python 및 OpenCV를 배우십시오!

☞ ░Go LaoYuanPython이 후 디렉토리를 블로그 https://blog.csdn.net/LaoYuanPython

추천

출처blog.csdn.net/LaoYuanPython/article/details/109210582