我有通过动作捕捉收集的15个标记的x,y,z坐标。我正在使用rgl包来创建标记的3D图像,我想将每个图像导出为单独的png文件。动作捕捉记录的长度为5-15秒,我以120 fps的帧速率输出坐标图像。所以,每次录制我必须输出600-2000张图像。
我编写了一个循环,用于绘制每个帧中的坐标,并将每个绘图的图像保存为png。但是,我得到的“保存”图像只是临时文件 - 当我给dev.off()时,图像消失,保存的文件转换为空白页面。很显然,我对如何处理设备和误解有些误解。写永久图像文件!
我知道rgl使用自己的设备,并且当达到最大设备数时(即导出63个图像后),我尝试使用rgl.close()而不是dev.off()。但是,如果没有给dev.off(),我继续得到“太多开放设备”的错误。
我的代码如下所示:
for (i in seq(1,nrow(opti),by=2)) {
tframe <- data.frame(matrix(cbind(opti[i, c(seq(1,43,by=3))],
opti[i, c(seq(2,44,by=3))],
opti[i, c(seq(3,45,by=3))]),
nrow = 15, ncol = 3))
par3d("windowRect" = c(0,0,1200,800))
png("filename", res = 600, width = 1200, height = 800)
plot3d(tframe$X1, tframe$X2, tframe$X3, size = 4, box = F, axes = F,
xlab = "", ylab = "", zlab = "")
segments3d(x = as.vector(tframe$X1[c(5,6)]),
y = as.vector(tframe$X2[c(5,6)]),
z = as.vector(tframe$X3[c(5,6)]))
segments3d(x = as.vector(tframe$X1[c(5,7)]),
y = as.vector(tframe$X2[c(5,7)]),
z = as.vector(tframe$X3[c(5,7)]))
segments3d(x = as.vector(tframe$X1[c(6,7)]),
y = as.vector(tframe$X2[c(6,7)]),
z = as.vector(tframe$X3[c(6,7)]))
rgl.snapshot("filename")
}
这是一个示例框架:
tframe <- data.frame(matrix(c(1775.061, -1210.373, 901.3876, 2007.21,
-1324.62, 786.1902, 2021.581, -1122.637, 787.6369, 2020.769,
-1214.902, 953.5361, 1832.449, -1226.912, 1281.304, 1721.739,
-1207.299, 1225.152, 1839.68, -1116.221, 1208.916, 1869.173,
-1362.631, 1017.457, 1958.79, -1364.152, 972.9478, 1784.636,
-1489.286, 738.0247, 1874.096, -1460.005, 834.2597, 1880.647,
-1091.414, 1032.096, 1979.333, -1059.292, 958.2598, 1796.085,
-914.6528, 747.6667, 1865.53, -945.6564, 817.4066),
nrow = 15, ncol = 3, byrow = T))
如何在关闭设备时编写不会变成空白的永久性图像文件?