본문 바로가기

MikuMikuDance/Tutorial

모션블러 효과 적용시 문제점과 개선

그동안 MMD 영상을 만들때 (영상 처리 면에서) 부족한점이 블룸 효과와 모션블러 효과 라고 생각해 왔습니다만..

블룸 효과는 MME Diffusion Filter 라는 걸출한 툴이 생기면서 MMD 자체적으로 처리가 가능해 졌습니다.






이제 모션블러만 남았는데.. 사실 MME 용으로 모션블러 효과가 나오긴 했지만
실제로 써먹기에는 조금 부족한것이 사실입니다.

때문에 AviSynth + Mvtools2 조합으로 인코딩하면서 모션블러를 적용시켜왔는데, 여기에 문제가 좀 있습니다.

예전에 올렸던 Lat식 하쿠와 네루로 하트캐치☆파라다이스! 를 보면

카메라 위치가 1프레임 단위로 바뀌는.. 즉 장면 전환 부분이 상당히 많이 들어있는데
모션블러를 적용하면서 장면 전환시 앞뒤 프레임이 상당히 망가지더군요.

예를 들어 보면










장면 전환이 있는 199 - 200 프레임이 뭉개져 버리는 현상을 볼 수 있습니다.

이건 MFlowBlur() 코드의 특성 때문인데, 앞뒤로 화면을 분석, 이동 벡터를 계산하여 블러 효과를 넣기 때문이죠.
199 - 200 프레임은 서로 연관이 없는 프레임 이기 때문에, 두 부분을 억지로 블러 효과로 이어 버리니 문제가 생기게 됩니다.

기존에 사용하던 코드를 간단히 보면 이런 식으로 되어 있습니다.

##############################################

ConvertToYUY2(AviSource("F:\lat_haku_htcp2.avi"))

super = MSuper()
backward_vectors = MAnalyse(super, isb = true, search = 3)
forward_vectors = MAnalyse(super, isb = false, search = 3)
MFlowBlur(super, backward_vectors, forward_vectors, blur=50)

##############################################

즉 MMD 에서 뽑아낸 원본 영상을 통째로 모션블러를 걸어 버리는데
앞서 말한 부작용이 있으니 이걸 고쳐야만 하는 상황이 되었습니다.

여기저기 구글링 하고 돌아다니다가 결국 해결책을 하나 뽑기는 했는데..

1) 장면 전환이 있는 프레임 구간을 분리해서 비디오 클립을 만든 다음

2) 각각의 클립에 모션 블러를 적용하고

3) 각각 처리된 클립을 하나로 모아 인코딩



그렇게 해서 만들어진 코드를 일단 보겠습니다.

##############################################

Source = ConvertToYUY2(AviSource("F:\lat_haku_htcp2.avi"))

clip1 = TrimMotionBlur (Source, 0, 199)
clip2 = TrimMotionBlur (Source, 200, 235)
clip3 = TrimMotionBlur (Source, 236, 289)
clip4 = TrimMotionBlur (Source, 290, 325)
clip5 = TrimMotionBlur (Source, 326, 374)
clip6 = TrimMotionBlur (Source, 375, 459)
clip7 = TrimMotionBlur (Source, 460, 524)
clip8 = TrimMotionBlur (Source, 525, 540)  
clip9 = TrimMotionBlur (Source, 541, 635)
clip10 = TrimMotionBlur (Source, 636, 699)
clip11 = TrimMotionBlur (Source, 700, 724)
clip12 = TrimMotionBlur (Source, 725, 900)
clip13 = TrimMotionBlur (Source, 901, 975)
clip14 = TrimMotionBlur (Source, 976, 1049)
clip15 = TrimMotionBlur (Source, 1050, 1080)
clip16 = TrimMotionBlur (Source, 1081, 1155)
clip17 = TrimMotionBlur (Source, 1155, 1235)
clip18 = TrimMotionBlur (Source, 1236, 1519)
clip19 = TrimMotionBlur (Source, 1520, 1535)
clip20 = TrimMotionBlur (Source, 1536, 1555)
clip21 = TrimMotionBlur (Source, 1556, 1590)
clip21_1 = TrimMotionBlur (Source, 1591, 1680)
clip22 = TrimMotionBlur (Source, 1681, 1785)
clip23 = TrimMotionBlur (Source, 1786, 1820)
clip24 = TrimMotionBlur (Source, 1821, 1890)
clip25 = TrimMotionBlur (Source, 1891, 1980)
clip26 = TrimMotionBlur (Source, 1981, 2099)
clip27 = TrimMotionBlur (Source, 2100, 2170)
clip28 = TrimMotionBlur (Source, 2171, 2254)
clip29 = TrimMotionBlur (Source, 2255, 2344)
clip30 = TrimMotionBlur (Source, 2345, 2444)
clip31 = TrimMotionBlur (Source, 2445, 2525)
clip32 = TrimMotionBlur (Source, 2526, 2561)
clip33 = TrimMotionBlur (Source, 2562, 2613)
clip34 = TrimMotionBlur (Source, 2614, 2651)
clip35 = TrimMotionBlur (Source, 2652, 2720)


clip1+clip2+clip3+clip4+clip5+ \
clip6+clip7+clip8+clip9+clip10+ \
clip11+clip12+clip13+clip14+clip15+ \
clip16+clip17+clip18+clip19+clip20+ \
clip21+clip21_1+clip22+clip23+clip24+clip25+ \
clip26+clip27+clip28+clip29+clip30+ \
clip31+clip32+clip33+clip34+clip35


function TrimMotionBlur (clip c, int start, int end)
{
src = Trim (c, start, end)
super = MSuper(src)
backward_vectors = MAnalyse(super, isb = true, search = 3)
forward_vectors = MAnalyse(super, isb = false, search = 3)
src = MFlowBlur(src, super, backward_vectors, forward_vectors, blur=50)
return src
}

##############################################


이게 왠 노가다 =_=;;;;;;;;;


장면 전환이 일어나는 구간, 즉 카메라가 점프하는 프레임을 전부 기록해서 일일이 적어야만 했습니다.

이게 이렇게 된건.. AviSynth 스크립트는 배열을 자체적으로 지원을 못하더군요. ( -_-)

일단 프레임이 뭉개지는 현상을 해결했고, 결과물은 만족스럽게 나왔지만

과정은 마음에.. 들지를 않네요.

뭔가 좋은 해결방법을 아시는 분은 알려주시면 감사하겠습니다.