代码让人头秃,可是我喜欢上了代码的逻辑感和代码解决问题的力量。
(我要对这个专题的图片进行修改,缩小看和我导头像有点像QAQ)

关于路径检查等操作使用的是Path或os.Path,视频的读取和转换使用的Opencv库函数,这里使用的是4.2.0版本,进行转换的核心库函数是cv2.imwrite。
| 更新版本 | 更新点 |
|---|---|
| V2.0 | 试着加入了from pathlib import Path,但是还是不熟练,不太会用,就和os.path混合着用了。你应该使用pathlib替代os.path |
| V2.1 | 1. 视频类型判断更加齐全;2. 打印说明更加详细 |
V2.2待优化部分:
"""
将视频转换为图片,可以为多个文件夹下的图片。
注:在程序使用前需先配置好main中的地址
视频路径:video_path_list = [path1, path2, ...](路径数量可以为[1,n],每个路径下的视频数也可为[1,m])
paht1 path2 ....
|------video1.avi |-----video1.avi
|------vidoe2.avi |-----...
|------....
图片存储路径:image_save_dir = save_path(存储方式则将按以下方式)
save_path
| -------path1_name
|----video1
|----jpg1.jpg
|----jpg2,jpg
|----video2
...
|-------path2_name
...
"""
import cv2
import os
from pathlib import Path
VID_FORMATS = ('.mov', '.avi', '.mp4', '.mpg', '.mpeg', '.m4v', '.wmv', '.mkv', '.mp3')
def videos2images(root_video_path, root_save_dir):
for video_dir_path in root_video_path:
# 1.检测读取文件路径是否正确
path_video = Path(video_dir_path)
if path_video.is_dir():
print(video_dir_path + '\t ok')
videos = os.listdir(video_dir_path)
else:
print('\033[31mLine36 error: \033[31m' + video_dir_path + 'is not exist!')
return
# 2. 生成存储文件夹
save_name_dir = Path(path_video.name)
save_name_dir = os.path.join(root_save_dir, save_name_dir)
if not os.path.exists(save_name_dir):
os.makedirs(save_name_dir)
file_count = 0
for video in videos:
# 判断是否为视频文件,如果不是视频文件则跳过并进行说明
if Path(video).suffix in VID_FORMATS:
file_count += 1 # 视频文件数+1
save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
if not os.path.exists(save_jpg_dir):
os.makedirs(save_jpg_dir)
each_video_path = os.path.join(path_video, video)
save_dir = save_jpg_dir
else:
print('\033[33mLine56 warning: \033[33m' + os.path.basename(video) + ' is not a video file, so skip.')
continue
# 3. 开始转换。打印正在处理文件的序号和他的文件名,并开始转换
print('\033[38m' + str(file_count) + ':' + Path(video).stem + '\033[38m')
cap = cv2.VideoCapture(each_video_path)
flag = cap.isOpened()
if not flag:
print("\033[31mLine 65 error\033[31m: open" + each_video_path + "error!")
frame_count = 0 # 给每一帧标号
while True:
frame_count += 1
flag, frame = cap.read()
if not flag: # 如果已经读取到最后一帧则退出
break
if os.path.exists(
save_dir + str(frame_count) + '.jpg'): # 在源视频不变的情况下,如果已经创建,则跳过
break
cv2.imwrite(save_dir + '\\' + str(frame_count) + '.jpg', frame)
cap.release()
print('\033[38m' + Path(video).stem + ' save to ' + save_dir + 'finished. \033[38m') # 表示一个视频片段已经转换完成
if __name__ == '__main__':
# 需要转换的视频路径列表,直达视频文件(自定义修改)
video_path_list = [r'E:\Code\feature_extraction_svm\video/', r'E:\Code\feature_extraction_svm\video2']
# 预期存储在的主文件夹,即'result'文件夹下
image_save_dir = r'E:\Code\feature_extraction_svm\result2'
path_save = Path(image_save_dir)
if not path_save.exists():
path_save.mkdir()
# 进行转换
videos2images(video_path_list, image_save_dir)
将创建’result’主文件夹和副文件夹

每个副文件夹下都将生成与视频名相对应的子文件夹,并按视频帧数顺序转换为jpg图片。

终端上将提示正在处理的文件路径,正在对哪个视频进行转换和转换完成提示。

python 如果文件夹不存在 创建文件夹
使用python实现视频与图片相互转换
Python zfill()方法
【Python】如何读取文件夹下的所有文件
python获取路径中的文件名
python如何从路径中获取文件名
Python print()输出颜色设置
python5行代码实现查看指定文件夹中的文件个数
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht