基于opencv的圖片轉(zhuǎn)Arcaea黑線程序
請注意!不允許使用該程序進(jìn)行盈利!
如某閑魚68RMB的約譜。
介于最近那個(gè)貓貓蟲哭哭加上兩個(gè)藍(lán)色的圖已經(jīng)傳到外國的Discord,同時(shí)那個(gè)黑線圖也是本人制作,所以在B站發(fā)布關(guān)于圖片轉(zhuǎn)黑線的代碼。
本程序由Python編寫,所以自行安裝Python環(huán)境與OpenCV-Python模塊。
代碼:
import CV2
def DrawVoidArc(VoidArcStartY,VoidArcEndY,VoidArcX,SceneTime):
? ? file.writelines(" ?arc({},{},{:.3f},{:.3f},s,{:.3f},{:.3f},0,none,true);\n".format(SceneTime,SceneTime,VoidArcX,VoidArcX,VoidArcStartY,VoidArcEndY))
#圖片設(shè)置
#圖片
img=CV2.imread("1.jpg",0)
#臨界值 越高黑的越多
CRITICALVALUE = 128
#圖片寬高 ? ? ? ? ? ?
img_height,img_width=img.shape
#輸入灰度圖,實(shí)現(xiàn)圖像二值化
ret,img=CV2.threshold(img,CRITICALVALUE,255,CV2.THRESH_BINARY)
#Arcaea相關(guān)設(shè)置
#黑線密度,越大越模糊
VoidArcDensity = 1
#黑線畫生成所在的時(shí)間(ms)
SceneTime = 1000
#黑線畫生成所在區(qū)域x方向上的寬度 ?
SceneWidth = 1.5 ?
SceneHeight = SceneWidth*2*img_height/img_width
#黑線畫生成所在區(qū)域的左下角坐標(biāo)
LocX,LocY = -0.25,-0.5 ? ? ?
VoidArcStartY=0
VoidArcEndY=0
VoidArcX=0
#輸出設(shè)置與初始化
filepath = "output.txt"
file=open(filepath, "w")
file.writelines("timinggroup(){\n ?timing(0,100.00,4.00);\n")
#畫黑線
flag=0
for j in range(0,img_width,VoidArcDensity):
? ? for i in range(0,img_height):
? ? ? ? #遍歷像素點(diǎn),記下第一個(gè)黑色像素點(diǎn)
? ? ? ? if img[i,j] == 0 and flag == 0 :
? ? ? ? ? ? flag=1
? ? ? ? ? ? VoidArcStartY=SceneHeight*(img_height-i)/img_height+LocY
? ? ? ? #遍歷像素點(diǎn),記下最后黑色像素點(diǎn)
? ? ? ? elif (img[i,j] == 255 or i == img_height-1) and flag == 1 :
? ? ? ? ? ? flag=0
? ? ? ? ? ? VoidArcEndY=SceneHeight*(img_height-i+1)/img_height+LocY
? ? ? ? ? ? VoidArcX=SceneWidth*j/img_width+LocX
? ? ? ? ? ? DrawVoidArc(VoidArcStartY,VoidArcEndY,VoidArcX,SceneTime)#畫黑線
#輸出完畢
file.writelines("};\n")
file.close()
放出以供參考,實(shí)現(xiàn)的方法也很簡單
先將一個(gè)圖片進(jìn)行灰度二值化,然后將每一列連續(xù)的灰度為0的像素記下,轉(zhuǎn)換到arc中相連。這個(gè)代碼通過修改遍歷的步數(shù)來修改最后呈現(xiàn)的黑線圖精密度。
不過在使用這個(gè)代碼前還是建議先對圖片處理一下,以為代碼中只是單純的在灰度128處二值化圖像灰度值,會(huì)導(dǎo)致出現(xiàn)生成的黑線圖不符合預(yù)期。而且現(xiàn)行的國內(nèi)Arcade沒有可以支持保存后arc坐標(biāo)值仍為3位數(shù)浮點(diǎn)數(shù)。
最后提出一個(gè)細(xì)分圖片灰度展示在Arcaea中的可行方案(?),可以通過疊黑線的方式來表示黑線灰度的疊加。但是同時(shí)相鄰的黑線太近(x軸距離大概0.03內(nèi))也會(huì)導(dǎo)致視覺上顏色變深,所以同時(shí)要規(guī)劃好黑線之間的距離。

很簡單代碼,下面是運(yùn)用的示例:


最后獻(xiàn)上 @N0N_ame 的作品《急》。