用OpenCV合成PNG和JPG圖片

open-cv

最近產(chǎn)品有了一個(gè)天才的想法血筑,做一個(gè)影集類似的功能,前面用圖片制作影像消恍、合成音頻的操作都還挺順利岂昭,但是到了給視頻添加特效的時(shí)候就遇到了困難。

以前使用Pr或繪聲繪影的時(shí)候就在想狠怨,這些軟件背后的代碼是什么樣的呢约啊?看來這一次我自己也可以親手體驗(yàn)一番了邑遏。

這次主要遇到了兩個(gè)問題:

  • 在圖片間插入過場動(dòng)畫 (這一篇將不會(huì)講到這個(gè))
  • 在視頻開頭添加一個(gè)半透明的幾何圖案

圖片合成

Google了一大票答案,很容易得出答案恰矩,OpenCV提供了<e>addWeighted</e>接口來做圖片合成的事情记盒。遂從手機(jī)上扒下來兩張圖來試試。

圖一 ( 4032 x 1884 )


在這里插入圖片描述

圖二 ( 1126 x 1122 )


在這里插入圖片描述
    # video.py
    import cv2

    view1 = cv2.imread('view1.jpg')
    view2 = cv2.imread('view2.jpg')
    # addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
    # alpha/beta 對應(yīng)兩張圖片的透明度, 0是完全透明 1是完全不透明
    view = cv2.addWeighted(view1, 0.7, view2, 0.5, 0)
    cv2.imwrite('view.jpg', view)

運(yùn)行一下外傅,呀纪吮,報(bào)錯(cuò)了

Traceback (most recent call last):
  File "video.py", line 270, in <module>
    view = cv2.addWeighted(view1, 0.7, view2, 1, 0)
cv2.error: OpenCV(3.4.2) /io/opencv/modules/core/src/arithm.cpp:659: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'arithm_op'

通過報(bào)錯(cuò)信息,得知待合成圖片的尺寸和<e>通道</e>必須要相等萎胰,這個(gè)尺寸好理解碾盟,通道是啥意思呢?

修改圖片尺寸

修改一下上面的代碼技竟,使它變成

    # video.py
    import cv2

    view1 = cv2.imread('view1.jpg')
    width = int((4032 - 1126) / 2)
    height = int((1884 - 1122) / 2)
    # 暴力裁剪
    # TODO: 這里有更好的裁剪方案
    view1 = view1[height:height + 1122, width:width + 1126]
    view2 = cv2.imread('view2.jpg')

    view = cv2.addWeighted(view1, 0.7, view2, 0.5, 0)
    cv2.imwrite('view.jpg', view)

成品

view.jpg ( 1126 x 1122 )


在這里插入圖片描述

帶Alpha通道的圖片和普通照片的合成

合成完圖片后冰肴,產(chǎn)品站在我身后,推了推眼鏡榔组,發(fā)現(xiàn)事情并不簡單熙尉。

“給你一個(gè)框,給我放到圖片里去”

背景實(shí)際上是透明的瓷患,這個(gè)黑色是在CSS中添加的骡尽,方便顯示


在這里插入圖片描述

我琢磨著,兩張圖的尺寸相同應(yīng)該就能合成成一張圖了吧擅编!但是正如上文所提到的攀细,圖片中的通道數(shù)和也必須要一致才能調(diào)用<e>addWeighted</e>方法進(jìn)行合成。

    # video.py
    import cv2

    # 使用cv2.IMREAD_UNCHANGED 將會(huì)保留 PNG的Alpha通道
    # 而直接讀取PNG也可以進(jìn)行圖像混合爱态,不過這種情況不在本次的討論中
    blank = cv2.imread('blank.png', cv2.IMREAD_UNCHANGED)
    print(blank.shape) # (756, 567, 4)

    view1 = cv2.imread('view1.jpg')
    width = int((4032 - 756) / 2)
    height = int((1884 - 567) / 2)
    # 合適的裁剪
    view1 = view1[height:height + 756, width:width + 567]
    print(view1.shape) # (756, 567, 3)

由于通道不相等谭贪,兩張圖片并不能合成為一張圖片,我們可以

  • 去掉blank的alpha通道
  • 為view1增加一條alpha通道

這里锦担,我選擇的是第二種方法

    # video.py
    import cv2
    import numpy

    # 實(shí)現(xiàn)細(xì)節(jié)
    b_channel, g_channel, r_channel = cv2.split(view1)
    # 添加alpha通道
    alpha_channel = numpy.ones(b_channel.shape, dtype=b_channel.dtype) * 50
    view1 = cv2.merge((b_channel, g_channel, r_channel, alpha_channel))

    print(view1) # (756, 567, 4)

成品


在這里插入圖片描述

原文地址 >> https://code.evink.me/2018/11/post/mix-png-and-jpg-use-OpenCV/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俭识,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洞渔,更是在濱河造成了極大的恐慌套媚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磁椒,死亡現(xiàn)場離奇詭異堤瘤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浆熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門本辐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事慎皱±铣妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵茫多,是天一觀的道長祈匙。 經(jīng)常有香客問我,道長地梨,這世上最難降的妖魔是什么菊卷? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宝剖,結(jié)果婚禮上洁闰,老公的妹妹穿的比我還像新娘。我一直安慰自己万细,他們只是感情好扑眉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赖钞,像睡著了一般腰素。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雪营,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天弓千,我揣著相機(jī)與錄音,去河邊找鬼献起。 笑死洋访,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谴餐。 我是一名探鬼主播姻政,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岂嗓!你這毒婦竟也來了汁展?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤厌殉,失蹤者是張志新(化名)和其女友劉穎食绿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體公罕,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡器紧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熏兄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摩桶,靈堂內(nèi)的尸體忽然破棺而出桥状,到底是詐尸還是另有隱情,我是刑警寧澤硝清,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布辅斟,位于F島的核電站,受9級特大地震影響芦拿,放射性物質(zhì)發(fā)生泄漏士飒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一蔗崎、第九天 我趴在偏房一處隱蔽的房頂上張望酵幕。 院中可真熱鬧,春花似錦缓苛、人聲如沸芳撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笔刹。三九已至,卻和暖如春冬耿,著一層夾襖步出監(jiān)牢的瞬間舌菜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工亦镶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留日月,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓染乌,卻偏偏與公主長得像山孔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子荷憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容