小编jla*_*sch的帖子

分拣点形成一条连续的线

我有一个表示线骨架的(x,y)坐标列表.该列表直接从二进制图像中获取:

import numpy as np    
list=np.where(img_skeleton>0)
Run Code Online (Sandbox Code Playgroud)

现在,列表中的点根据它们沿着一个轴在图像中的位置进行排序.

我想对列表进行排序,使得顺序代表沿线的平滑路径.(目前不是线条向后弯曲的情况).随后,我想为这些点拟合样条.

这里使用arcPy描述并解决了类似的问题.有没有一种方便的方法来实现这个使用python,numpy,scipy,openCV(或其他库?)

下面是一个示例图像.它产生了59(x,y)坐标的列表. 在此输入图像描述

当我将列表发送到scipy的样条拟合程序时,我遇到了一个问题,因为这些点在行上没有"排序":

在此输入图像描述

python opencv numpy image-processing scipy

25
推荐指数
3
解决办法
5893
查看次数

python类属性为pandas数据帧

我想从通过'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中实现这一点?

python pandas

8
推荐指数
1
解决办法
9901
查看次数

使用python(和matplotlib?)将页面附加到现有的pdf文件

我想将页面附加到现有的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的替代品也将受到赞赏.

python pdf matplotlib

7
推荐指数
1
解决办法
6348
查看次数

当渠道不再提供软件包时重现 conda 环境

我想发布用于科学论文基础数据分析的 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)

python conda

7
推荐指数
1
解决办法
2882
查看次数

使用python将opencv图像传输到ffmpeg

如何将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 video opencv ffmpeg

5
推荐指数
2
解决办法
3884
查看次数

python中视频帧的多处理

我是 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)

python multiprocessing

5
推荐指数
1
解决办法
3542
查看次数

ffmpeg:多个filter_complex的链,重用中间输出流

如何顺序应用两个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]不能像我尝试的那样重复使用?

如何为后续过滤器多次重复使用中间流?

ffmpeg

4
推荐指数
1
解决办法
1860
查看次数

swarmplot上面的seaborn pointplot

我试图在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)

在此输入图像描述

python matplotlib pandas seaborn

4
推荐指数
1
解决办法
696
查看次数

使用ffmpeg对输入视频进行多次裁剪操作

我想将视频文件(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)

等等...

可以将其合并为一个命令以提高执行速度吗?

video ffmpeg

2
推荐指数
1
解决办法
1608
查看次数

在python中使用matplotlib在pdf中的现有页面之间插入新页面

是否可以将新页面插入多页 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 页。

python pdf matplotlib

2
推荐指数
1
解决办法
1598
查看次数

在tight_layout 后调整matplotlib 子图间距

我想尽量减少图中的空白。我有一排子图,其中四个图共享它们的 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)

在此处输入图片说明

python matplotlib

1
推荐指数
1
解决办法
1898
查看次数