用Python实现视频字符化(蔡徐坤唱跳Rap视频)
Posted Ability Power
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python实现视频字符化(蔡徐坤唱跳Rap视频)相关的知识,希望对你有一定的参考价值。
用PyCharm运行代码,若未安装可去官网下载社区版
教程如下:
1. 安装cv2库和numpy库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
可以选择在PyCharm的Terminal中输入这段代码,也可以在cmd中输入python后再输入这段代码
2.视频字符化代码
import cv2
import numpy as np
def readVideo(path):
videoCapture = cv2.VideoCapture()
videoCapture.open(path)
frames = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT)
fps = videoCapture.get(cv2.CAP_PROP_FPS)
for i in range(int (0),int(fps*10)):
ret,frame = videoCapture.read()
#ret是bool类型,frame是image ndarray类型
src = cv2.resize(frame,(int (frame.shape[1]*0.6),int (frame.shape[0]*0.6)))
src = imageToChar(src)
cv2.imshow('frame',src)
cv2.waitKey(1)
def imageToChar(img):
string = "&*@#%qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
count = len(string)
u, v, _= img.shape
c = img*0 + 0
# c = np.zeros((u,v))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('output', c)
for i in range(0, u-1,10):
for j in range(0, v-1,10):
pix = gray[i, j]
b, g, r = img[i, j]
zifu = string[int(((count - 1) * pix) / 256)]
cv2.putText(c, zifu, (j, i), cv2.FONT_HERSHEY_COMPLEX, 0.5,(int(255),int(255),int(255)))
return c
readVideo('image/test.mp4')
cv2.waitKey(0)
3.放入视频
在安装PyCharm的目录下新建一个名为image的文件夹,再在这个文件夹下面放入视频,视频名字命名为test.mp4,若运行失败,则将倒数第二行的代码readVideo('image/test.mp4)改为readVideo('../image/test.mp4)
蔡徐坤唱跳Rap 4K高清视频地址:
(可以用手机端进入链接下载视频)
4.结果展示
唱跳Rap
唱跳rap和篮球
唱、跳、rap和篮球
大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类:一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap,还有一部分最喜欢篮球。如果队列中(k,k + 1,k+1,k + 2,k+2,k + 3,k+3)位置上的同学依次,最喜欢唱、最喜欢跳、最喜欢rap、最喜欢篮球,那么他们就会聚在一起讨论蔡徐坤。大中锋不希望这种事情发生,因为这会使得队伍显得很乱。大中锋想知道有多少种排队的方法,不会有学生聚在一起讨论蔡徐坤。两个学生队伍被认为是不同的,当且仅当两个队伍中至少有一个位置上的学生的喜好不同。由于合法的队伍可能会有很多种,种类数对998244353取模。
Input
输入数据只有一行。每行55个整数,第一个整数n,代表大中锋的学院要组织多少人去参观博物馆。接下来四个整数a、b、c、d,分别代表学生中最喜欢唱的人数、最喜欢跳的人数、最喜欢rap的人数和最喜欢篮球的人数。保证(a+b+c+d ge n)。
Output
每组数据输出一个整数,代表你可以安排出多少种不同的学生队伍,使得队伍中没有学生聚在一起讨论蔡徐坤。结果对998244353取模。
Sample Input 1
4 4 3 2 1
Sample Output 1
174
Sample Input 2
996 208 221 132 442
Sample Output 2
442572391
思路:
(令f_x=(n-4x)!sumlimits_{i=0}^asumlimits_{j=0}^bsumlimits_{k=0}^csumlimits_{w=0}^d[a+b+c+d=n-4x]frac{1}{i!j!k!w!})
(ans=sumlimits_{i=0}^{min{a,b,c,d,lfloorfrac{n}{4}
floor}}(-1)^i(^{n-3i}_{ i})f_i)
证明:
后面把讨论蔡徐坤的段叫(jntm)
(考虑枚举jntm的数量,进行容斥)
(假设f_i为在去掉jntm后的方案数)
(ecause 每个jntm长度4)
( herefore 有C_{n-3i}^i的方案数)
( herefore ans=sumlimits_{i=0}^{min{a,b,c,d,lfloorfrac{n}{4}
floor}}(-1)^i(^{n-3i}_{ i})f_i)
(考虑枚举剩下的位置中有多少个j,n,t,m)
(f_x=sumlimits_{i=0}^asumlimits_{j=0}^bsumlimits_{k=0}^csumlimits_{w=0}^d[a+b+c+d=n-4x]frac{(n-4x)!}{i!j!k!w!}=(n-4x)!sumlimits_{i=0}^asumlimits_{j=0}^bsumlimits_{k=0}^csumlimits_{w=0}^d[a+b+c+d=n-4x]frac{1}{i!j!k!w!})
(发现可以NTT优化卷积,时间复杂度O(n^2log_2n))
(mathfrak{Talk is cheap ,show you the code.})
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
# define read read1<int>()
# define Type template<typename T>
Type inline T read1(){
T n=0;
char k;
bool fl=0;
do (k=getchar())=='-'&&(fl=1);while('9'<k||k<'0');
while(47<k&&k<58)n=(n<<3)+(n<<1)+(k^48),k=getchar();
return fl?-n:n;
}
inline int r(int mod){
int n=0;
char k;
bool fl=0;
do (k=getchar())=='-'&&(fl=1);while('9'<k||k<'0');
while(47<k&&k<58)n=(10ll*n+(k^48))%mod,k=getchar();
return fl?mod-n:n;
}
# define f(i,l,r) for(int i=(l);i<=(r);++i)
# define fre(k) freopen(k".in","r",stdin);freopen(k".ans","w",stdout)
# define ll int64_t
class Array{
private:
vector<int>a;
public:
Array(const int size,const int f):a(size,f){}
void push(int n){a.push_back(n);}
Array(int* l=NULL,int* r=NULL){while(l!=r)push(*l),++l;}
inline int size(){return a.size();}
inline int& operator [] (const int x){return a[x];}
void resize(int n){a.resize(n);}
void clear(){a.clear();}
void swap(){reverse(a.begin(),a.end());}
int& top(){return a[a.size()-1];}
void pop(){a.pop_back();}
Array& operator %= (const int k){
for(int i=0;i<size();++i)
a[i]%=k;
return *this;
}
};
const int mod=998244353,g=3,inv2=499122177;
Array operator -(Array a,Array b){
int N=a.size(),M=b.size();
Array t;
for(int i=0;i<N||i<M;++i){
t.push((i<N?a[i]:0)-(i<M?b[i]:0));
if(t.top()<0)t.top()+=mod;
}
return t;
}
Array operator +(Array a,Array b){
int N=a.size(),M=b.size();
Array t;
for(int i=0;i<N||i<M;++i){
t.push((i<N?a[i]:0)+(i<M?b[i]:0));
if(t.top()>=mod)t.top()-=mod;
}
return t;
}
Array operator *(Array a,int n){
int N=a.size();
for(int i=0;i<N;a[i]=(ll)a[i]*n%mod,++i);
return a;
}
Array operator *(int n,Array a){return a*n;}
int qkpow(int b,int m,int mod){
int tem=b,ans=1;
for(;m;m>>=1,tem=(ll)tem*tem%mod)
if(m&1)ans=(ll)ans*tem%mod;
return ans;
}
int* NTT(const int len,Array& a,const bool Ty,int* r=NULL){
if(!r){
r=new int[len];
r[0]=0;int L=log2(len);
f(i,0,len-1)
r[i]=(r[i>>1]>>1)|((i&1)<<L-1);
}
f(i,0,len-1)
if(i<r[i])swap(a[i],a[r[i]]);
for(int i=1;i<len;i<<=1){
int T=qkpow(Ty?g:332748118,(mod-1)/(i<<1),mod);
for(int W=i<<1,j=0;j<len;j+=W){
ll omega=1;
for(int k=0;k<i;++k,omega=omega*T%mod){
ll x(a[j+k]),y(omega*a[i+j+k]%mod);
a[j+k]=x+y;(a[j+k]>=mod)&&(a[j+k]-=mod);
a[i+j+k]=x-y+mod;(a[i+j+k]>=mod)&&(a[i+j+k]-=mod);
}
}
}
return r;
}
Array operator * (Array x,Array y){
int n=x.size()-1,m=y.size()-1;
int limit=1;
while(limit<=n+m)limit<<=1;
Array ans;
x.resize(limit+1);
y.resize(limit+1);
int *r;
r=NTT(limit,x,1);
NTT(limit,y,1,r);
f(i,0,limit)x[i]=(ll)x[i]*y[i]%mod;
NTT(limit,x,0,r);
int tem=qkpow(limit,mod-2,mod);
f(i,0,n+m)ans.push((ll)x[i]*tem%mod);
return ans;
}
Array& operator *= (Array& x,Array y){
return x=x*y;
}
void Rev(Array &x,Array y){
int n=x.size()-1,m=y.size()-1;
int limit=1;
while(limit<=n+m)limit<<=1;
Array ans;
x.resize(limit+1);
y.resize(limit+1);
int *r;
r=NTT(limit,x,1);
NTT(limit,y,1,r);
f(i,0,limit)x[i]=(ll)(2ll-(ll)x[i]*y[i]%mod+mod)%mod*y[i]%mod;
NTT(limit,x,0,r);
int tem=qkpow(limit,mod-2,mod);
f(i,0,n+m)x[i]=(ll)x[i]*tem%mod;
x.resize(n+m+1);
}
Array Inv(Array a){
int N=a.size();
// printf("%d
",N);
if(N==1)return Array(1,qkpow(a[0],mod-2,mod));
Array b=a;b.resize(N+1>>1);
b=Inv(b);b.resize(N);
Rev(a,b);
a.resize(N);
return a;
}
Array operator / (Array x,Array y){
int N=x.size()-1,M=y.size()-1;
if(N<M)return Array(1,0);
x.swap();y.swap();
y.resize(N-M+1);
x*=Inv(y);
x.resize(N-M+1);
x.swap();
return x;
}
Array sqrt(Array x){
int N=x.size();
if(N==1)return Array(1,1);
Array y=x;
y.resize(N+1>>1);
y=sqrt(y);
y.resize(N);
Array z=Inv(y);
x*=z;x.resize(N);
return inv2*(y+x);
}
Array diff(Array x){
for(int i=0;i+1<x.size();++i)
x[i]=(ll)x[i+1]*(i+1)%mod;
x.pop();
return x;
}
Array integral(Array x){
for(int i=x.size();--i;)
x[i]=(ll)x[i-1]*qkpow(i,mod-2,mod)%mod;
x[0]=0;
return x;
}
Array ln(Array x){
int N=x.size();
x=integral(diff(x)*Inv(x));
x.resize(N);
return x;
}
Array exp(Array x){
int N=x.size();
if(N==1)return Array(1,1);
Array y=x;
y.resize(N+1>>1);
y=exp(y);
y.resize(N);
y[0]=1;
++x[0];
y*=(x-ln(y));
y.resize(N);
return y;
}
int fac[1001],n(read),a(read),b(read),c(read),d(read),inv[1001];
Array x,y,z,w;
int C(int n,int m){return (ll)fac[n]*inv[n-m]%mod*inv[m]%mod;}
int sigma(int l){
int ans=C(n-l*3,l),A=a-l,B=b-l,C=c-l,D=d-l;
x.clear();y.clear();z.clear();w.clear();
f(i,0,A)x.push(inv[i]);
f(i,0,B)y.push(inv[i]);
f(i,0,C)z.push(inv[i]);
f(i,0,D)w.push(inv[i]);
int limit=1;
while(limit<=A+B+C+D)limit<<=1;
x.resize(limit+1);
y.resize(limit+1);
z.resize(limit+1);
w.resize(limit+1);
int *r;
r=NTT(limit,x,1);
NTT(limit,y,1,r);
NTT(limit,z,1,r);
NTT(limit,w,1,r);
f(i,0,limit)x[i]=(ll)x[i]*y[i]%mod*z[i]%mod*w[i]%mod;
NTT(limit,x,0,r);
int tem=qkpow(limit,mod-2,mod);
return (ll)ans*fac[n-(l<<2)]%mod*x[n-(l<<2)]%mod*tem%mod;
}
int main(){
fac[1]=fac[0]=inv[0]=inv[1]=1;
for(int i=2;i<=1000;++i)
inv[i]=qkpow(fac[i]=(ll)fac[i-1]*i%mod,mod-2,mod);
int s=min(n>>2,min(a,min(b,min(c,d)))),ans=0;
for(int i=0;i<=s;++i)
if(i&1)ans=(ans-sigma(i)+mod)%mod;
else ans=(ans+sigma(i))%mod;
printf("%d",ans);
return 0;
}
以上是关于用Python实现视频字符化(蔡徐坤唱跳Rap视频)的主要内容,如果未能解决你的问题,请参考以下文章