实现抖音霓虹灯效果---OpenCV-Python开发指南(55)

抖音霓虹灯原理

抖音霓虹灯算法原理:

  1. 实时的光斑绘制,我们观察抖音霓虹的,你会发现所有的光斑都是圆形。所以,这里我们会使用cv2.circle()函数负责绘制霓虹圆形效果。
  2. 设计多幅素材图片,黑底上面有亮色的光斑,不同的图片中光斑的位置不同。

算法原理简单点翻译就是:加载视频,每间隔1帧在图像绘制光斑,一共定义4种光斑的位置,循环在视频中进行渲染。

实现4个图片霓虹灯效果

一般来说霓虹灯的效果都在视频的上下左右的边缘。为了让读者更加的通俗易懂一点,我们先来实现4个角的霓虹灯效果。

具体代码如下所示:

# 图片霓虹等效果
def img_neon_effetc(img, x, y, filenameSize):
    cv2.circle(img, (x, y), 20, (114, 128, 250), -1)
    cv2.circle(img, (x + 40, y - 40), 20, (153, 255, 102), -1)
    cv2.circle(img, (x + 80, y + 40), 20, (15, 254, 123), -1)
    cv2.circle(img, (x + 60, y), 20, (238, 169, 184), -1)
    cv2.imwrite("55_" + filenameSize + ".jpg", img)


if __name__ == "__main__":
    img = cv2.imread("55.jpg")
    img1=img.copy()
    height, width, n = img.shape
    img_neon_effetc(img1, int(width * 0.1), int(height * 0.1), "1")
    img1 = img.copy()
    img_neon_effetc(img1, int(width * 0.1), int(height * 0.9), "2")
    img1 = img.copy()
    img_neon_effetc(img1, int(width * 0.9), int(height * 0.1), "3")
    img1 = img.copy()
    img_neon_effetc(img1, int(width * 0.9), int(height * 0.9), "4")

运行之后,会得到4个文件,效果如下:


1.png

实现视频霓虹灯效果

既然有了上述4个霓虹灯模板,相信读者应该知道要做什么了吧?没错,使用开始博文制作鬼影的函数cv2.addWeighted()函数进行图像加权和。

完整的霓虹灯代码如下所示:

#视频霓虹灯效果
def video_neon_effect(img, cnt):
    if cnt == 0:
        return img
    height, width, n = img.shape
    mask = {
        1: cv2.imread("55_1.jpg"),
        2: cv2.imread("55_2.jpg"),
        3: cv2.imread("55_3.jpg"),
        4: cv2.imread("55_4.jpg"),
    }
    mask[cnt] = cv2.resize(mask[cnt], (width, height), interpolation=cv2.INTER_CUBIC)
    new_img = cv2.addWeighted(img, 0.7, mask[cnt], 0.3, 0)
    return new_img


if __name__ == "__main__":
    cap = cv2.VideoCapture("45.mp4")
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    i = 1
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    videoWriter = cv2.VideoWriter("output.avi", fourcc, fps, (width, height))
    while (cap.isOpened()):
        ret, frame = cap.read()
        if ret:
            frame = video_neon_effect(frame, i % 5)
            cv2.imshow('video', frame)
            videoWriter.write(frame)
            i += 1
            c = cv2.waitKey(1)
            if c == 27:
                break
        else:
            break
    cap.release()
    videoWriter.release()
    cv2.destroyAllWindows()

运行之后,效果如下:


2.png

这里,你可以先将霓虹灯图像进行压缩,然后通过cv2.resize()函数将图片变更为视频的大小后,再进行加权和计算。实际的操作中,你还需要根据视频的帧数进行霓虹灯的设计操作,这里为了简便,小编只用了4张。

直接实现霓虹灯效果

上面我们是通过图片加权和进行霓虹灯效果的实现,但是是不是觉得跟抖音有点差距呢?这里,我们直接用代码实现霓虹灯,不用任何中间的操作,具体步骤如下:

  1. 随机生成一个霓虹灯图片,上面绘制了许多圆形。
  2. 记住这些圆形的位置信息,后面霓虹灯的变更更改其圆形颜色即可。

具体代码如下所示:

# 创建霓虹灯的圆
def create_neon_circle():
    mask = np.zeros((576, 1024, 3), dtype=np.uint8)
    circle_list = []
    height, width, n = mask.shape
    for i in range(0, width, 50):
        for j in range(0, height, 50):
            r = random.randint(0, 255)
            g = random.randint(0, 255)
            b = random.randint(0, 255)
            x = i + random.randint(0, 90)
            y = j + random.randint(0, 90)
            cv2.circle(mask, (x, y), 20, (r, g, b), -1)
            circle_list.append((x, y))
    cv2.imwrite("55_1.jpg", mask)
    return circle_list, mask


# 霓虹灯效果2
def video_neon_effect2(img, circle_list):
    height, width, n = img.shape
    mask = np.zeros((height, width, n), dtype=np.uint8)
    for x, y in circle_list:
        r = random.randint(0, 255)
        g = random.randint(0, 255)
        b = random.randint(0, 255)
        cv2.circle(mask, (x, y), 20, (r, g, b), -1)
    new_img = cv2.addWeighted(img, 0.7, mask, 0.3, 0)
    return new_img,mask


if __name__ == "__main__":
    cap = cv2.VideoCapture("45.mp4")
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    i = 1
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    videoWriter = cv2.VideoWriter("output.avi", fourcc, fps, (width, height))
    circle_list, img = create_neon_circle()
    while (cap.isOpened()):
        ret, frame = cap.read()
        if ret:
            frame = cv2.addWeighted(frame, 0.7, img, 0.3, 0)
            if i % 7 == 0:
                frame ,img= video_neon_effect2(frame, circle_list)
            cv2.imshow('video', frame)
            videoWriter.write(frame)
            i += 1
            c = cv2.waitKey(1)
            if c == 27:
                break
        else:
            break
    cap.release()
    videoWriter.release()
    cv2.destroyAllWindows()

运行之后,效果如下:


output.gif

这里霓虹灯有些多,读者可以自己设置for循环的边界,比如只在屏幕顶端有霓虹灯效果,可以直接将For循环的高度缩小到顶部区域即可。如果觉得圆圈不好看,也可以设置绘制椭圆等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容