- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了定义可能根据输入视频而变化的 ROI(感兴趣区域),我使用了以下方法:
创建一个空白的黑色图像
使用opencv函数减去背景
将白色像素(前景)复制到空白图像 5 分钟
问题:在 2 个 for 循环下,if 语句和其中的指令正在减慢处理时间:
if opening[i][j] == 255 or opening[i][j] == 127:
blank_image[i][j] = [255, 255, 255]
我对 opencv 不熟悉,而且我是新手,所以我不知道是否有更好的方法。
import numpy as np
import cv2
import sys
import time
from PIL import Image
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = 0)
video = 'C:/Users/HP/Desktop/sentdex/testLongVideo.mp4'
cap = cv2.VideoCapture(video)
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #get the frame height
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #get the frame width
x = 0
start = time.process_time() #start time
while(1 and time.process_time() - start < 300):
ret,frame = cap.read()
fgmask = fgbg.apply(frame) #apply the MOG2 mask on the video
erode = cv2.erode(fgmask, None, iterations = 1) #erosion to erase unwanted small contours
opening = cv2.morphologyEx(erode, cv2.MORPH_OPEN, None) #eliminate false positive on erosion
if x < 5: #this condition is used because if the creation of the black image starts at the same time as the video all the pixels will be white
blank_image = np.zeros((frame_height,frame_width,3), np.uint8) #create a black image with the same height and width of the video
x += 1
else:
for i in range(len(opening)):
for j in range(len(opening[i])):
if [i,j] not in checked and opening[i][j] == 255 or opening[i][j] == 127: #skip the treated pixels and check which pixels of the treated frame are white or gray (moving objects and their shadows)
blank_image[i][j] = [255, 255, 255] #turn the pixels in the black image to white from the treated video by the X and Y
checked.append([i,j]) #treated pixels
cv2.imwrite('backgroundMask.png', blank_image) #saving the background treated
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
我试着在里面没有任何东西的情况下运行循环,它运行得很好:
for i in range(len(opening)):
for j in range(len(opening[i])):
continue
当我添加一条没有 if 语句的指令时,速度非常慢:
for i in range(len(opening)):
for j in range(len(opening[i])):
blank_image[i][j] = [255, 255, 255]
但是当我加上 if 语句的时候,即使里面没有任何指令,它也更慢了:
for i in range(len(opening)):
for j in range(len(opening[i])):
if opening[i][j] == 255:
continue
最佳答案
如评论中所述,您通常希望避免像
这样的模式for i in range(height):
for j in range(width):
array[i][j] = ...
在遍历 numpy 数组时。与 C 语言中的循环相比,Python 中的循环速度较慢,部分原因是类型在使用之前不是显式的或不为解释器所知——因此类型检查发生在循环内的每个变量上。还有其他原因。但是 numpy 和类似的库实际上是在后端使用 C 和 Fortran 等实现的,因此如果您使用内置的 numpy 函数,您的代码将大大加快。
如果你想在一个数组中设置多个项目,你可以通过多种方式来实现。您可以同时使用一系列索引进行索引,而不是使用 i
和 j
等单个数字进行索引,例如
>>> img
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> img[(0, 1, 2, 3), (1, 2, 3, 4)] = 1
>>> img
array([[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
如您所见,这在 img
中将 (0, 1), (1, 2), ... 设置为 1。
您也可以一次设置整个子区域:
>>> img[2:6, 2:6] = 1
>>> img
array([[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
但是你要找的是boolean or masked indexing .这将替换模式:
for i in range(height):
for j in range(width):
if array[i][j] == 1:
array[i][j] = 2
用简单的线条
array[array==1] = 2
如果你把这里的部分分开,就很容易看出发生了什么:
>>> img
array([[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> img==1
array([[False, True, False, False, False, False, False, False],
[False, False, True, False, False, False, False, False],
[False, False, True, True, True, True, False, False],
[False, False, True, True, True, True, False, False],
[False, False, True, True, True, True, False, False],
[False, False, True, True, True, True, False, False],
[False, False, False, False, False, False, False, False],
[False, False, False, False, False, False, False, False]], dtype=bool)
所以这里我们有一个数组,其形状与 img
相同,但 bool 值告诉哪些我们感兴趣的项目。此 bool 数组可用于索引原始数组。
>>> img[img==1]
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=uint8)
这里我们看到数组 img
在 img==1
处的值为 1。我们可以将 img
中的所有这些值设置为另一个值:
>>> img[img==1] = 2
>>> img
array([[0, 2, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0, 0, 0],
[0, 0, 2, 2, 2, 2, 0, 0],
[0, 0, 2, 2, 2, 2, 0, 0],
[0, 0, 2, 2, 2, 2, 0, 0],
[0, 0, 2, 2, 2, 2, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
简而言之,看起来你只是简单地需要
blank_image[(opening==255) | (opening==127)] = 255
关于python - 如果感兴趣,提取区域的处理时间较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47949828/
您好,我是使用 xampp 的 PHPmyadmin 新手,没有 MYSQL 背景。当我喜欢研究它是如何工作的时,我的脑海中浮现出一个想法,它让我一周都无法休眠,因为我似乎无法弄清楚如何使用 MIN(
Go docs say (强调): Programs using times should typically store and pass them as values, not pointers.
我有一组用户在 8 月 1 日有一个条目。我想找到在 8 月 1 日有条目但在 8 月 2 日没有做任何事情的用户。 现在是 10 月,所以事件已经过去很久了。 我有限的知识说: SELECT * F
我有以下代码,主要编码和取消编码时间结构。这是代码 package main import ( "fmt" "time" "encoding/json" ) type chec
您能详细解释一下“用户 CPU 时间”和“系统 CPU 时间”吗?我读了很多,但我不太理解。 最佳答案 区别在于时间花在用户空间还是内核空间。用户 CPU 时间是处理器运行程序代码(或库中的代码)所花
应用程序不计算东西,但做输入/输出、读取文件、使用网络。我希望探查器显示它。 我希望像 callgrind 中的东西一样,在每个问题中调用 clock_gettime。 或者像 oprofile 那样
目前我的 web 应用程序接收 websocket 数据来触发操作。 这会在页面重新加载时中断,因此我需要一个能够触发特定事件的客户端解决方案。 这个想法可行吗? 假设你有 TimeX = curre
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一个 Instant (org.joda.time.Instant) 的实例,我在一些 api 响应中得到它。我有另一个来自 (java.time.Instant) 的实例,这是我从其他调用中获得
如何集成功能 f(y) w.r.t 时间;即 'y'是一个包含 3000 个值和值 time(t) 的数组从 1 到 3000 不等。所以,在整合 f(y) 后我需要 3000 个值. 积分将是不确定
可以通过 CLI 创建命名空间,但是如何使用 Java SDK 来创建命名空间? 最佳答案 它以编程方式通过 gRPC API 完成由服务公开。 在 Java 中,生成的 gRPC 客户端可以通过 W
我有一个函数,它接受 2 组日期(开始日期和结束日期),这些日期将用于我的匹配引擎 我必须知道start_date1和end_date1是否在start_date2和end_date2内 快进:当我在
我想从 Python 脚本运行“time”unix 命令,以计算非 Python 应用程序的执行时间。我会使用 os.system 方法。有什么方法可以在Python中保存这个输出吗?我的目标是多次运
我正在寻找一种“漂亮的数字”算法来确定日期/时间值轴上的标签。我熟悉 Paul Heckbert's Nice Numbers algorithm . 我有一个在 X 轴上显示时间/日期的图,用户可以
在 PowerShell 中,您可以格式化日期以返回当前小时,如下所示: Get-Date -UFormat %H 您可以像这样在 UTC 中获取日期字符串: $dateNow = Get-Date
我正在尝试使用 Javascript 向父子窗口添加一些页面加载检查功能。 我的目标是“从父窗口”检测,每次子窗口完全加载然后执行一些代码。 我在父窗口中使用以下代码示例: childPage=wi
我正在尝试设置此 FFmpeg 命令的 drawtext 何时开始,我尝试使用 start_number 但看起来它不会成功。 ffmpeg -i 1.mp4 -acodec aac -keyint_
我收到了一个 Excel (2010) 电子表格,它基本上是一个文本转储。 单元格 - J8 具有以下信息 2014 年 2 月 4 日星期二 00:08:06 EST 单元格 - L8 具有以下信息
我收到的原始数据包含一列具有以下日期和时间戳格式的数据: 2014 年 3 月 31 日凌晨 3:38 单元格的格式并不一致,因为有些单元格有单个空格,而另一些单元格中有两个或三个字符之间的空格。所以
我想知道是否有办法在我的 Grails 应用程序顶部显示版本和构建日期。 编辑:我应该说我正在寻找构建应用程序的日期/时间。 最佳答案 在您的主模板中,或任何地方。 Server version:
我是一名优秀的程序员,十分优秀!