基于opencv的图片转Arcaea黑线程序
请注意!不允许使用该程序进行盈利!
如某闲鱼68RMB的约谱。
介于最近那个猫猫虫哭哭加上两个蓝色的图已经传到外国的Discord,同时那个黑线图也是本人制作,所以在B站发布关于图片转黑线的代码。
本程序由Python编写,所以自行安装Python环境与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))
#图片设置
#图片
img=CV2.imread("1.jpg",0)
#临界值 越高黑的越多
CRITICALVALUE = 128
#图片宽高
img_height,img_width=img.shape
#输入灰度图,实现图像二值化
ret,img=CV2.threshold(img,CRITICALVALUE,255,CV2.THRESH_BINARY)
#Arcaea相关设置
#黑线密度,越大越模糊
VoidArcDensity = 1
#黑线画生成所在的时间(ms)
SceneTime = 1000
#黑线画生成所在区域x方向上的宽度
SceneWidth = 1.5
SceneHeight = SceneWidth*2*img_height/img_width
#黑线画生成所在区域的左下角坐标
LocX,LocY = -0.25,-0.5
VoidArcStartY=0
VoidArcEndY=0
VoidArcX=0
#输出设置与初始化
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):
#遍历像素点,记下第一个黑色像素点
if img[i,j] == 0 and flag == 0 :
flag=1
VoidArcStartY=SceneHeight*(img_height-i)/img_height+LocY
#遍历像素点,记下最后黑色像素点
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()
放出以供参考,实现的方法也很简单
先将一个图片进行灰度二值化,然后将每一列连续的灰度为0的像素记下,转换到arc中相连。这个代码通过修改遍历的步数来修改最后呈现的黑线图精密度。
不过在使用这个代码前还是建议先对图片处理一下,以为代码中只是单纯的在灰度128处二值化图像灰度值,会导致出现生成的黑线图不符合预期。而且现行的国内Arcade没有可以支持保存后arc坐标值仍为3位数浮点数。
最后提出一个细分图片灰度展示在Arcaea中的可行方案(?),可以通过叠黑线的方式来表示黑线灰度的叠加。但是同时相邻的黑线太近(x轴距离大概0.03内)也会导致视觉上颜色变深,所以同时要规划好黑线之间的距离。

很简单代码,下面是运用的示例:


最后献上 @N0N_ame 的作品《急》。