我有一个表示线骨架的(x,y)坐标列表.该列表直接从二进制图像中获取:
import numpy as np
list=np.where(img_skeleton>0)
Run Code Online (Sandbox Code Playgroud)
现在,列表中的点根据它们沿着一个轴在图像中的位置进行排序.
我想对列表进行排序,使得顺序代表沿线的平滑路径.(目前不是线条向后弯曲的情况).随后,我想为这些点拟合样条.
这里使用arcPy描述并解决了类似的问题.有没有一种方便的方法来实现这个使用python,numpy,scipy,openCV(或其他库?)
当我将列表发送到scipy的样条拟合程序时,我遇到了一个问题,因为这些点在行上没有"排序":
我想从通过'append'生成的类列表的属性填充pandas数据帧.(不确定这是描述下面'allFoo'的正确术语这是一个精简的示例代码:
class foo(object):
def __init__(self,input):
self.val=input
#in real life, there will be many more attributes in this class
allFoo=[];
for i in range(10):
allFoo.append(foo(i))
Run Code Online (Sandbox Code Playgroud)
现在我想定义一个新的pandas数据框'df',它从allFoo.val(而不是任何其他属性)填充
这样的事情:
df[0]=foo[0].val
df[1]=foo[1].val
Run Code Online (Sandbox Code Playgroud)
等等
我来自matlab,我会尝试这样的事情:dataFrame = allFoo [:].val
我怎么能在python/pandas中实现这一点?
我想将页面附加到现有的pdf文件中.
目前,我正在使用matplotlib pdfpages.但是,一旦文件关闭,将另一个数字保存到其中会覆盖现有文件而不是附加.
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
class plotClass(object):
def __init__(self):
self.PdfFile='c:/test.pdf'
self.foo1()
self.foo2()
def foo1(self):
plt.bar(1,1)
pdf = PdfPages(self.PdfFile)
pdf.savefig()
pdf.close()
def foo2(self):
plt.bar(1,2)
pdf = PdfPages(self.PdfFile)
pdf.savefig()
pdf.close()
test=plotClass()
Run Code Online (Sandbox Code Playgroud)
我知道在调用pdf.close()之前可以通过多次调用pdf.savefig()来追加,但我想附加到已经关闭的pdf.
matplotlib的替代品也将受到赞赏.
我想发布用于科学论文基础数据分析的 conda 环境。我使用以下命令将环境保存到 .yml 文件conda env export > environment.yml
我能够使用conda env create -f environment.yml
. 几个月后,从同一个 .yml 文件创建环境失败:
ResolvePackageNotFound:
- vc=14.1=h0510ff6_3
- vs2015_runtime=15.5.2=3
大概这些版本在文件中指定的频道上不再可用?或者这能反映一个不同的问题吗?
也许,在我的具体情况下,确切的版本并不那么重要,但这个问题似乎首先违背了拯救环境的目的。是否有不同的命令或策略以更面向未来的方式拯救环境?
我正在尝试使用 miniconda 安装环境。
康达版本 4.5.4
python版本:3.6.5.final.0
这是完整的 .yml 文件:
name: jlsocial
channels:
- conda-forge
- defaults
dependencies:
- ca-certificates=2018.4.16=0
- certifi=2018.4.16=py36_0
- libiconv=1.15=hfa6e2cd_1
- libxml2=2.9.8=haffccfe_2
- libxslt=1.1.32=h5632236_1
- lxml=4.2.3=py36heafd4d3_0
- openssl=1.0.2o=hfa6e2cd_1
- svglib=0.8.1=py36_0
- svgutils=0.3.0=py36_0
- backcall=0.1.0=py36_0
- blas=1.0=mkl
- bleach=2.1.3=py36_0
- blosc=1.14.3=he51fdeb_0
- bokeh=0.12.16=py36_0
- bzip2=1.0.6=hfa6e2cd_5
- click=6.7=py36hec8c647_0
- cloudpickle=0.5.3=py36_0
- colorama=0.3.9=py36h029ae33_0 …
Run Code Online (Sandbox Code Playgroud) 如何将openCV图像传输到ffmpeg(作为子进程运行ffmpeg)?(我正在使用spyder/anaconda)
我正在从视频文件中读取帧并在每个帧上进行一些处理.
import cv2
cap = cv2.VideoCapture(self.avi_path)
img = cap.read()
gray = cv2.cvtColor(img[1], cv2.COLOR_BGR2GRAY)
bgDiv=gray/vidMed #background division
Run Code Online (Sandbox Code Playgroud)
然后,为了将处理过的帧传递给ffmpeg,我在一个相关问题中找到了这个命令:
sys.stdout.write( bgDiv.tostring() )
Run Code Online (Sandbox Code Playgroud)
接下来,我试图将ffmpeg作为子进程运行:
cmd='ffmpeg.exe -f rawvideo -pix_fmt gray -s 2048x2048 -r 30 -i - -an -f avi -r 30 foo.avi'
sp.call(cmd,shell=True)
Run Code Online (Sandbox Code Playgroud)
(这也来自上面提到的帖子)然而,这填充了我的IPython控制台与神秘的象形文字然后崩溃它.任何建议?
最终,我想输出4个流并让ffmpeg并行编码这4个流.
我是 python 多处理的新手。我想从一小时长的视频文件的每一帧中提取特征。处理每一帧大约需要 30 毫秒。我认为多处理是一个好主意,因为每一帧都是独立于所有其他帧进行处理的。
我想将特征提取的结果存储在自定义类中。
我阅读了一些示例,最终按照此处的建议使用了多处理和队列。结果令人失望,现在每帧大约需要 1000 毫秒来处理。我猜我产生了大量的开销。
有没有更有效的方法来并行处理帧并收集结果?
为了说明,我整理了一个虚拟示例。
import multiprocessing as mp
from multiprocessing import Process, Queue
import numpy as np
import cv2
def main():
#path='path\to\some\video.avi'
coordinates=np.random.random((1000,2))
#video = cv2.VideoCapture(path)
listOf_FuncAndArgLists=[]
for i in range(50):
#video.set(cv2.CAP_PROP_POS_FRAMES,i)
#img_frame_original = video.read()[1]
#img_frame_original=cv2.cvtColor(img_frame_original, cv2.COLOR_BGR2GRAY)
img_frame_dummy=np.random.random((300,300)) #using dummy image for this example
frame_coordinates=coordinates[i,:]
listOf_FuncAndArgLists.append([parallel_function,frame_coordinates,i,img_frame_dummy])
queues=[Queue() for fff in listOf_FuncAndArgLists] #create a queue object for each function
jobs = [Process(target=storeOutputFFF,args=[funcArgs[0],funcArgs[1:],queues[iii]]) for iii,funcArgs in enumerate(listOf_FuncAndArgLists)]
for job in jobs: job.start() # …
Run Code Online (Sandbox Code Playgroud) 如何顺序应用两个filter_complex命令?
首先,我想将视频与图像混合,然后我想获取该过滤器的输出并将其拆分为4个图块,如本文Stackoverflow中所述.
我试过这个:(我的策略是从filter_complex [int]生成一个中间输出,我想重复使用该输出两次.
ffmpeg.exe
-i videoIn.avi
-i imageIn.avi
-filter_complex "[1:0] setsar=sar=1 [1sared];[0:0][1sared]blend=all_mode='divide':repeatlast=1[int];
[int]crop=960:960:24:1055:[out1];
[int]crop=960:960:1056:1062:[out2]"
-map [out1] out1.avi
-map [out2] out2.avi
Run Code Online (Sandbox Code Playgroud)
然而,我正在一个错误:流指定符 'INT' 在FilterGraph动态描述[INT]作物= 960:960:24:1055 [OUT1]; [INT]作物= 960:960:1056:1062:[OUT2]匹配不流
如果我只使用一个裁剪操作但不使用两个 - 这个代码有效 - 所以我猜测中间流[int]不能像我尝试的那样重复使用?
如何为后续过滤器多次重复使用中间流?
我试图在swarmplot的顶部使用seaborn的pointPlot绘制组明智的中值.即使我将pointPlot称为第二个,点图也会在swarmplot后面结束.如何更改"图层顺序"以使点图位于swarmplot前面?
datDf=pd.DataFrame({'values':np.random.randint(0,100,100)})
datDf['group']=np.random.randint(0,5,100)
sns.swarmplot(data=datDf,x='group',y='values')
sns.pointplot(data=datDf,x='group',y='values',estimator=np.median,join=False)
Run Code Online (Sandbox Code Playgroud)
我想将视频文件(2048x2048px,100.000帧)有效地分成多个图块。通常,分成四个相等大小的象限(1024x1024px,100.000帧)。我可以使用ffmpeg的裁剪过滤器在另一个砖块上进行切换:
ffmpeg -i in.avi -filter:v "crop=1024:1024:0:0" out1.mp4
ffmpeg -i in.avi -filter:v "crop=1024:1024:1023:0" out2.mp4
Run Code Online (Sandbox Code Playgroud)
等等...
可以将其合并为一个命令以提高执行速度吗?
是否可以将新页面插入多页 pdf 文件的任意位置?
在这个虚拟示例中,我正在创建一些 pdf 页面:
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
with PdfPages('dummy.pdf') as pdf:
for i in range(5):
plt.plot(1,1)
pdf.savefig()
plt.close()
Run Code Online (Sandbox Code Playgroud)
现在我想绘制其他内容并将新图保存为 pdf 的第 1 页。
我想尽量减少图中的空白。我有一排子图,其中四个图共享它们的 y 轴,最后一个图有一个单独的轴。共享轴中间面板没有 ylabels 或 ticklabels。
tight_layout
在中间图之间创建了很多空白区域,好像为刻度标签和 ylabels 留出了空间,但我宁愿拉伸子图。这可能吗?
import matplotlib.gridspec as gridspec
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
fig = plt.figure()
gs = gridspec.GridSpec(1, 5, width_ratios=[4,1,4,1,2])
ax = fig.add_subplot(gs[0])
axes = [ax] + [fig.add_subplot(gs[i], sharey=ax) for i in range(1, 4)]
axes[0].plot(np.random.randint(0,100,100))
barlist=axes[1].bar([1,2],[1,20])
axes[2].plot(np.random.randint(0,100,100))
barlist=axes[3].bar([1,2],[1,20])
axes[0].set_ylabel('data')
axes.append(fig.add_subplot(gs[4]))
axes[4].plot(np.random.randint(0,5,100))
axes[4].set_ylabel('other data')
for ax in axes[1:4]:
plt.setp(ax.get_yticklabels(), visible=False)
sns.despine();
plt.tight_layout(pad=0, w_pad=0, h_pad=0);
Run Code Online (Sandbox Code Playgroud)