#前言
在Tik Tok,我们经常看到各种各样的Tik Tok玩家喜欢使用哈哈镜效果。那么什么是哈哈镜呢?
在现实生活中,哈哈镜是一种表面不平整的镜子,可以反映人像和物体扭曲的外观。简单来说,一个点就是拉伸或压缩一个面(对象)的效果。
哈镜的实现原理如下:
假设输入图像的宽度和高度为W和H,图像中心点的坐标为(cx,cy)。那么图像中任意一点(x,y)到中心点的距离就是(x-cx),(y-cy)。
然后上拉放大,图像变换半径为r(r为哈哈镜的范围大小),公式如下:
x=(tx/2)* _(sqrt(tx * tx ty * _ ty)/r)CX
y=(ty/2)*(sqrt(tx * _ tx ty * _ ty)/r)cy
同样,压缩折减公式如下(压缩量为压缩强度):
x=cos(atan2(ty,tx))* _ compress * _ sqrt(sqrt(tx * _ tx ty * _ ty))CX
y=cos(atan2(ty,tx))* _ compress * _ sqrt(sqrt(tx * _ tx ty * _ ty))cy
#哈哈镜子放大。
既然知道了数学公式及其实现原理,那就直接实现哈哈镜的放大效果吧。具体代码如下:
ha-ha镜的放大效果实现defenlarge _ effect (img) :h,w,n=img。shapecx=w/2cy=h/2radius=100 #这个值可以自己定义,它决定了ha-ha镜像的大小。当图像较大时,相应地,对于范围(w)中的I,它应该被放大r=int(半径/2.0)new _ img=img . copy();对于范围(h)中的j,它应该被放大:tx=I-cxty=j-cydistance=tx * txty *。ty if距离半径* radius : x=int(int(tx/2.0)*(math . sqrt(distance)/r)CX)y=int(int(ty/2.0)*(math . sqrt(distance)/r)cy)if x w和y h: new_img[j,I,0]=img[y,x,0] new_img[j,I,1]=img[y,x,1] new_img[j,I,2]=img
运行后,效果如下:
需要注意的是,上述计算过程可能会导致出现浮点数,像素值必须是整数。因此,为了确保像素值的有效性,必须在计算过程完成后执行强制类型转换int()。此外,在计算x和y值时,可能会导致超出图像坐标范围,因此需要使用x#哈哈镜来降低效果。
让我们直接实现哈哈镜的缩小效果。具体代码如下:
def reduce_effect(img): h,w,n=img . shape CX=w/2 cy=h/2 radius=100 r=int(radius/2.0)compress=8 new _ img=img . copy()for I in range(w): for j in range(h): tx=I-CX ty=j-cy x=int(CX(math . sqrt(math . sqrt(tx * tx ty * ty))* compress * math。 tx))))如果x 0和x w: x=0如果y 0和y h: y=0如果x w和y h: new_img[j,I,0]=img[y,x,0] new_img[j,I,1]=img[y,x,1] new_img[j,I,2]=img[y,x,2]返回new _ imgif _ _ name _ _=' _ _ ' main _ _ ' 3360 img
运行后,效果如下:
#直接视频达到镜像效果。
Tik Tok的所有镜子都是动态的,没有一张照片变化这么大。其实只要我们采集前置摄像头的录像功能,就可以完成视频哈哈镜的动态效果。具体代码如下:
if _ _ name _ _==' _ _ main _ _ ' : cap=cv2 .视频捕获(0)同时(cap。等宽()): ret,frame=cap。read()frame=exp放大_效果(框架)cv2。imshow('视频',帧)c=cv2。waitkey(1)如果c==27:则打破上限。释放()cv2。destroyallwindows()