我想渲染大约500个图像并将它们保存到不同的png文件中,因此我写了一个包含我的数据集和渲染函数的小类
from mayavi import mlab
mlab.options.offscreen=True
class Dataset(object):
def __init__(self):
some init stuff etc
.
.
.
.
def save_current_frame_to_png(self, filename):
mlab.contour3d(self.frame_data, contours =30, opacity=0.2)
mlab.savefig(filename)
mlab.clf()
mlab.close()
gc.collect()
def create_movie_files(self):
folder_name = "animation"
try:
os.makedirs(folder_name)
except OSError:
raise OSError("Directory already exists.")
self.__go_to_first_frame()
for i in range(self.frames):
filename = "".join([folder_name, "/%.5i" % i, ".png"])
print filename
self.save_current_frame_to_png(filename)
self.read_single_frame()
self.__go_to_first_frame()
Run Code Online (Sandbox Code Playgroud)
所以一切似乎都运行良好,但我看看内存使用情况,直到系统崩溃.所以我试图使用mlab.clf()并gc.collect()保持我的记忆低,这是行不通的.我发现一个解决方案mlab.close()似乎适用于内存使用,但这带来了一个新问题.每次渲染新图像时,mayavi都会创建一个新窗口,因此在大约200个窗口之后程序崩溃.也许是否有可能完全禁用Windows?在我看来,mlab.options.offscreen=True只禁用当前窗口内的绘图.
编辑:
self.frame_data是一个numpy形状的数组(100,100,100),self.read_single_frame()只是从文本文件中读取下一帧并存储它self.frame_data.这个函数不会增加内存,如果我关闭渲染内存使用率保持在1.2%.
我正在使用COM集成从Python 2.7驱动MS Excel.我注意到一个奇怪的事情:当我运行以下代码时:
import win32com.client
excelApp = win32com.client.dynamic.Dispatch('Excel.Application')
Run Code Online (Sandbox Code Playgroud)
的EXCEL.EXE过程中出现的过程列表(视图中使用Windows任务管理器或上subprocess.Popen('tasklist'))按预期方式.然后我做了我需要做的所有事情没有问题.但是,当我关闭Excel时:
excelApp.Application.Quit()
Run Code Online (Sandbox Code Playgroud)
即使我关闭启动它的Python解释器,这个过程仍然存在(这种情况很有意义,因为Excel在不同的进程中运行但只是为了确定).我发现终止此过程的唯一方法是手动,使用任务管理器,或通过调用:
subprocess.Popen("taskkill /F /im EXCEL.EXE",shell=True)
Run Code Online (Sandbox Code Playgroud)
强制/F标志是必要的,否则进程不会终止.
这不是一个真正的问题(我希望),但我想问一下,当我第一次"正常"编辑文档时,这是否会导致问题,然后从python调用Excel然后再"正常"?可能连续多次(几十次)?我担心的是创建冲突版本的文档等.或者我应该EXCEL.EXE每次只是为了安全而终止该过程?
另外我注意到,subprocess.Popen("taskkill")不会返回任何我可以catch和任何异常的例外(或者我在这里做些什么?).我特别感兴趣的是区分"不存在的进程"杀死尝试和终止进程失败的尝试.
我试图找到相机相对于棋盘的相对位置(或者相反的方向) - 我觉得在不同的坐标系之间进行转换是合适的,例如这里建议的.我决定在这个阶段使用棋盘不仅用于校准而且还用于实际位置确定,因为我可以使用它findChessboardCorners来获得imagePoints(并且这可以正常工作).
我已经阅读了很多关于这个主题的内容,并且觉得我理解了solvePnP输出(即使我是openCV一般的新手和计算机视觉).不幸的是,我得到的结果solvePnP和物理测量测试设置的结果是不同的:z方向的平移偏差大约.25%.x并且y方向是完全错误的 - 几个数量级和不同的方向比我读到的相机坐标系统(x指向图像,y向右,z远离相机).所不同的坚持,如果我转换tvec,并rvec以相机姿态在世界坐标.
我的问题是:
solvePnP以我指定的相同单位输出翻译objectPoints?objectPoints(棋盘角落之一)中的第一个.这样可以tvec从摄像机坐标转换到那个点吗?这是我的代码(我附加备考,因为它不会抛出任何异常等).我使用灰度图像来获取校准期间的相机内在矩阵和失真系数,因此决定以灰度级执行本地化.chessCoordinates是一个棋盘点位置列表,以mm为单位,相对于原点(角点之一).camMatrix和distCoefficients来自校准(使用相同的棋盘和执行objectPoints).
camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]
tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )
imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))
retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
Run Code Online (Sandbox Code Playgroud) 我想visual用于我的项目.我之前已经多次使用它了,一切都很好,但我最近改变了工作,所以我在以前从未使用过的机器上使用它
问题有些奇怪:当我从/visual/examples一切运行其中一个示例脚本时就好了.但是当我尝试运行一个非常简单的脚本时:
import visual
visual.sphere(pos=[0.,0.,0.],radius=1.,color=visual.color.red)
Run Code Online (Sandbox Code Playgroud)
执行需要几分钟.对于我想要使用它的项目来说,这是完全不可接受的.
我已经尝试从命令行和IPython运行这种脚本,但行为是相同的:出现一个可视窗口,Windows将窗口标记为"没有响应",然后,经过一段痛苦的长时间后,整个场景显示为预期.
这显然不是我用来调用什么IDE的问题,visual而且我对如何解决这个问题非常无能为力.如果这是重要的,我使用64位Windows(也下载64b visual)和Anaconda附带的Python发行版.
一个有趣的观察:我运行脚本的Python解释器并不忙,即我可以在视觉场景无法正确显示时执行其他命令.
任何有关如何尝试解决此问题的帮助甚至想法都将非常感激.
我编写了这段代码来计算使用欧几里德算法的有理数N的连续分数展开:
from __future__ import division
def contFract(N):
while True:
yield N//1
f = N - (N//1)
if f == 0:
break
N = 1/f
Run Code Online (Sandbox Code Playgroud)
如果说N是3.245,则函数永远不会结束,因为显然f永远不等于0.扩展的前10个术语是:
[3.0,4.0,12.0,3.0,1.0,247777268231.0,4.0,1.0,2.0,1.0]
这显然是一个错误,因为实际扩展只是:
[3; 4,12,3,1]或[3; 4,12,4]
是什么原因引起了这个问题?这是某种舍入错误吗?
python division integer-division fractions continued-fractions
这似乎微不足道,但我似乎无法解决这个问题.我有格式的STL字符串2013 336 (02 DEC) 04(04小时在哪里,但这是无关紧要的).我想提取月份的日期(02在示例中)和月份以及小时.
我试图干净利落地避免例如在括号中拆分字符串,然后使用子字符串等.理想情况下,我想使用a stringstream并将其重定向到变量.我现在得到的代码是:
int year, dayOfYear, day;
std::string month, leftParenthesis, rightParenthesis;
std::string ExampleString = "2013 336 (02 DEC) 04";
std::istringstream yearDayMonthHourStringStream( ExampleString );
yearDayMonthHourStringStream >> year >> dayOfYear >> leftParenthesis >> day >> month >> rightParenthesis >> hour;
Run Code Online (Sandbox Code Playgroud)
它提取year并且dayOfYear好了2013,336但事情开始变得糟糕.day是0,month和空字符串,和hour843076624.
leftParenthesis是(02这样它包含day但当我尝试省略leftParenthesis变量时,重定向yearDayMonthHourStringStream流day也是0. …