user: 已知一个视频的高384宽640,通过目标识别到视频内有运动的 机头,可以获取机头中心点的xy坐标,机头运动方式是沿着x轴往复运动,怎样判断机头目前状态是前进还是后退 请用python写出具体代码

user: 已知一个视频的高384宽640,通过目标识别到视频内有运动的 机头,可以获取机头中心点的xy坐标,机头运动方式是沿着x轴往复运动,怎样判断机头目前状态是前进还是后退 请用python写出具体代码

user: 已知一个视频的高384宽640,通过目标识别到视频内有运动的 机头,可以获取机头中心点的xy坐标,机头运动方式是沿着x轴往复运动,怎样判断机头目前状态是前进还是后退 请用python写出具体代码

chatgpt: 可以通过机头中心点在x轴的运动方向来判断机头目前状态是前进还是后退。在每个时间步中,计算机头中心点在x轴的位置,然后与前一个时间步的位置进行比较,如果当前位置在前一个位置的右侧,则机头正在往前移动,否则机头正在往后移动。

下面是一个示例代码,假设机头中心点的x,y坐标已经存储在x_coordy_coord变量中:

# 初始化变量
previous_x_coord = 0
movement_direction = 'stopped'

# 在视频的每个时间步计算机头在x轴的位置
for frame in video:
    x_coord = get_head_center_x_coord(frame)
    
    # 判断机头状态
    if x_coord > previous_x_coord:
        movement_direction = 'forward'
    elif x_coord < previous_x_coord:
        movement_direction = 'backward'
    else:
        movement_direction = 'stopped'
    
    # 保存当前位置作为下一个时间步的前一个位置
    previous_x_coord = x_coord
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

在上面的代码中,get_head_center_x_coord(frame)函数应该返回机头中心点在当前帧中的x坐标。movement_direction变量将保存机头当前的运动方向,可以根据需要用于后续的分析和处理。

user: 每隔20帧判断一次

chatgpt: 如果只需要每隔20帧判断一次机头的运动方向,可以在代码中加入一个计数器来实现。每处理20帧,就计算一次机头运动方向。

以下是修改后的示例代码:

# 初始化变量
previous_x_coord = 0
movement_direction = 'stopped'
frame_counter = 0

# 在视频的每个时间步计算机头在x轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)

        # 判断机头状态
        if x_coord > previous_x_coord:
            movement_direction = 'forward'
        elif x_coord < previous_x_coord:
            movement_direction = 'backward'
        else:
            movement_direction = 'stopped'

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord

        # 重置计数器
        frame_counter = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

在上述代码中,我们添加了一个名为frame_counter的计数器变量来记录已处理的帧数,如果frame_counter的值为20,则进行一次逻辑,这样就只需要检查每20帧一次机头的运动方向。 这个数字20可以根据需要进行调整。

user: 统计10秒内机头反向运动的次数,如果10秒内检测到6次返现运动只记录一次

chatgpt: 对于统计10秒内机头反向运动的次数,可以在代码中使用两个变量来记录状态:movement_directionreverse_motion_detected

movement_direction变量用于存储当前帧的机头运动方向(正向、反向或停止),reverse_motion_detected变量用于跟踪过去10秒内是否检测到了反向运动。通过在循环中添加计时器和条件语句,可以对连续的反向运动进行记录。

以下是一个示例代码:

# 初始化变量
previous_x_coord = 0
movement_direction = 'stopped'
reverse_motion_detected = False
reverse_motion_counter = 0
frame_counter = 0
start_time = time.time()

# 在视频的每个时间步计算机头在x轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)

        # 判断机头状态
        if x_coord > previous_x_coord:
            movement_direction = 'forward'
        elif x_coord < previous_x_coord:
            movement_direction = 'backward'
        else:
            movement_direction = 'stopped'

        # 检查是否存在反向运动
        if movement_direction == 'backward':
            if not reverse_motion_detected:
                reverse_motion_detected = True
                reverse_motion_counter += 1
        else:
            reverse_motion_detected = False

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去10秒钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 10:
            # 如果有连续的反向运动,只计算为1次
            if reverse_motion_counter >= 6:
                reverse_motion_counter = 1
            
            # 输出结果并重新计时和计数器
            print(f'The number of reverse motion detected in the last 10 seconds: {reverse_motion_counter}')
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

在上述代码中,我们增加了新的变量reverse_motion_detectedreverse_motion_counter用于记录连续反向运动次数。在每次检测到反向运动时,如果reverse_motion_detectedFalse表示之前没有检测到反向运动,那么我们记录该次反向运动并将reverse_motion_detected标记为True

在循环的结尾处,我们检查是否已经过去10秒钟(elapsed_time >= 10),如果是,则输出反向运动的成功计数器reverse_motion_counter。 如果reverse_motion_counter超过6个,则只计算为1个,并重置计数器和计时器。这样,我们可以在10秒内记录多个连续反向运动,但它们被视为一个事件。

user: movement_direction 波动还是太大了,能更稳定的判断机头的方向吗

chatgpt: 如果movement_direction变量的波动较大,可以尝试对其进行平滑处理来稳定判断机头的方向。一种常见的方法是使用滑动窗口平均值。

维护一个大小为n的窗口,每次将窗口向右移动一个元素并计算窗口内元素的平均值,这样就可以获得平滑的数据序列。在这个问题中,我们可以维护一个大小为3或5的窗口,然后将窗口内的movement_direction值取平均值来获取稳定的状态。

以下是一个示例代码:

# 初始化变量
window_size = 5
previous_x_coord = 0
movement_direction = 'stopped'
smoothed_movement_direction = 'stopped'
reverse_motion_detected = False
reverse_motion_counter = 0
frame_counter = 0
start_time = time.time()

# 定义一个滑动窗口
window = [0] * window_size

# 在视频的每个时间步计算机头在x轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)

        # 判断机头状态
        if x_coord > previous_x_coord:
            movement_direction = 'forward'
        elif x_coord < previous_x_coord:
            movement_direction = 'backward'
        else:
            movement_direction = 'stopped'

        # 将当前状态加入窗口
        window = window[1:] + [movement_direction]

        # 计算平均状态
        counts = Counter(window)
        smoothed_movement_direction = counts.most_common(1)[0][0]

        # 检查是否存在反向运动
        if smoothed_movement_direction == 'backward':
            if not reverse_motion_detected:
                reverse_motion_detected = True
                reverse_motion_counter += 1
        else:
            reverse_motion_detected = False

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去10秒钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 10:
            # 如果有连续的反向运动只计算为1次
            if reverse_motion_counter >= 6:
                reverse_motion_counter = 1

            # 输出结果并重新计时和计数器
            print(f'The number of reverse motion detected in the last 10 seconds: {reverse_motion_counter}')
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

在上述代码中,我们向上述代码添加了一个滑动窗口,并在每次更新窗口后计算窗口中元素的平均值(即smoothed_movement_direction)。然后,使用平滑的状态检查是否存在反向运动,并存储连续反向运动的计数器。

增加滑动窗口大小可能需要调整其他参数来保证正确性。

user: 把机头的y坐标也加如到判断机头方向里

chatgpt: 如果想要将机头的y坐标也考虑在内来判断机头运动的方向,可以结合x轴和y轴的坐标来计算机头的运动方向。

假设get_head_center_y_coord(frame)函数可以返回机头中心点在当前帧中的y坐标,我们可以记录两个变量previous_x_coordprevious_y_coord表示前一个时间步的机头中心坐标,然后计算本时间步的机头中心坐标和前一个时间步的机头中心坐标之间的距离。如果机头中心坐标在X轴方向移动并且距离大于某个阈值,这意味着机头正在移动。如果距离超过阈值且x轴方向距离大于y轴方向距离,则可以判断机头正向移动,反之则是反向移动。

以下是一个示例代码:

# 初始化变量
previous_x_coord = 0
previous_y_coord = 0
movement_direction = 'stopped'
reverse_motion_detected = False
reverse_motion_counter = 0
frame_counter = 0
start_time = time.time()

# 在视频的每个时间步计算机头在x轴和y轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)
        y_coord = get_head_center_y_coord(frame)

        # 计算机头中心点的位移
        distance = math.sqrt((x_coord - previous_x_coord)**2 + (y_coord - previous_y_coord)**2)

        # 根据位移的大小和方向来判断机头运动方向
        if distance > 10 and abs(x_coord - previous_x_coord) > abs(y_coord - previous_y_coord):
            if x_coord > previous_x_coord:
                movement_direction = 'forward'
            elif x_coord < previous_x_coord:
                movement_direction = 'backward'
            else:
                movement_direction = 'stopped'
        else:
            movement_direction = 'stopped'

        # 检查是否存在反向运动
        if movement_direction == 'backward':
            if not reverse_motion_detected:
                reverse_motion_detected = True
                reverse_motion_counter += 1
        else:
            reverse_motion_detected = False

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord
        previous_y_coord = y_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去10秒钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 10:
            # 如果有连续的反向运动只计算为1次
            if reverse_motion_counter >= 6:
                reverse_motion_counter = 1
                
            # 输出结果并重新计时和计数器
            print(f'The number of reverse motion detected in the last 10 seconds: {reverse_motion_counter}')
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

在上述代码中,我们添加了previous_y_coord变量存储前一个时间步的机头的Y坐标,使用欧几里得距离计算位移并做出方向判断。阈值10用于确保只有机头的中心移动超过10像素时,才认为在移动中。

根据实际情况,阈值和判断机头方向的方法可能需要调整。

user: 增加滑动窗口算法

chatgpt: 在判断机头运动方向时,使用滑动窗口平均值能够使结果更加平滑和稳定。此外,如果我们使用滑动窗口算法,就可以直接考虑到前面输入的历史数据,不仅仅只考虑最近的几个状态。

以下是一个示例代码:

# 初始化变量
window_size = 10 # 注意:滑动窗口需要开一个比较大的窗口大小,同时要满足阈值要求,才能获得相对稳定的状态
previous_x_coord = 0
previous_y_coord = 0
movement_direction = 'stopped'
reverse_motion_detected = False
reverse_motion_counter = 0
frame_counter = 0
start_time = time.time()

# 定义一个滑动窗口
window = []

# 在视频的每个时间步计算机头在x轴和y轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)
        y_coord = get_head_center_y_coord(frame)

        # 计算机头中心点的位移
        distance = math.sqrt((x_coord - previous_x_coord)**2 + (y_coord - previous_y_coord)**2)

        # 根据位移的大小和方向来判断机头运动方向
        if distance > 10 and abs(x_coord - previous_x_coord) > abs(y_coord - previous_y_coord):
            if x_coord > previous_x_coord:
                movement_direction = 'forward'
            elif x_coord < previous_x_coord:
                movement_direction = 'backward'
            else:
                movement_direction = 'stopped'
        else:
            movement_direction = 'stopped'

        # 将当前状态加入滑动窗口
        window.append(movement_direction)

        # 如果窗口满了,就移除最早的状态
        if len(window) > window_size:
            window.pop(0)

        # 如果滑动窗口中的状态与运动方向相同,则认为机头正在运动
        if window.count(movement_direction) >= window_size//2: # 窗口大小要为偶数,这里采用整除
            is_moving = True
        else:
            is_moving = False

        # 检查是否存在反向运动
        if is_moving and movement_direction == 'backward':
            if not reverse_motion_detected:
                reverse_motion_detected = True
                reverse_motion_counter += 1
        else:
            reverse_motion_detected = False

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord
        previous_y_coord = y_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去10秒钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 10:
            # 如果有连续的反向运动只计算为1次
            if reverse_motion_counter >= 6:
                reverse_motion_counter = 1
                
            # 输出结果并重新计时和计数器
            print(f'The number of reverse motion detected in the last 10 seconds: {reverse_motion_counter}')
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

在上述代码中,我们首先定义了一个大小

user: 继续

chatgpt: 为 window 的滑动窗口窗口大小,然后将每个运动方向加入到窗口中,并移除最早的状态以使滑动窗口保持恒定大小。

窗口中的状态计数通过直接使用列表方法count()来检查。如果滑动窗口中的状态与运动方向相同,我们认为机头正在运动,并在达到连续反向运动的阈值时记录反向运动。

需要注意的是,窗口大小应该适当地调整以获得更好的结果,同时根据数据特征来选择阈值以进行机头运动的判断。

user: movement_direction 的值一直是 stopped

chatgpt: 如果 movement_direction 的值一直是stopped,可以检查计算机头位置的代码是否存在问题。如果机头位置一直无法更新,会导致方向始终为stopped

除此之外,还有可能是机头的运动太小,没有超过设定的阈值。在上述示例代码中,使用的阈值为10像素,如果机头中心在相邻的两个时间步中移动的距离小于10像素,则机头的方向将被视为stopped。您可以尝试调整这个阈值,使代码能够检测到更小的运动距离。

最后,如果以上两种情况均未解决问题,您可以检查与机头运动无关的代码以查看是否存在其他潜在问题。

user: 机头的 x y

chatgpt: 机头通常可以使用计算机视觉技术来检测并确定其在图像或视频中的位置。一种常用的方法是使用人脸检测算法,例如OpenCV库中提供的Haar Cascade检测器来检测面部区域,然后基于面部区域来估计头部的位置。

在得到头部位置的坐标之后,可以将坐标用于计算机头在X轴和Y轴上的位置。通常需要先将图像或视频的坐标系与相机坐标系对应起来,并考虑任何变换或旋转,以便将图像或视频的坐标转换为实际世界坐标。然后,可以使用像素与实际距离的比例关系以及头部部位的大小来计算头部的实际位置。

以下是一个简单的示例代码,可以用于计算机头在图像中的X和Y坐标:

import cv2

def get_head_center_x_coord(frame):
    # 加载Haar Cascade模型
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface.xml')

    # 将图像转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 在灰度图像中检测面部区域
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 如果未检测到面部区域,返回0
    if len(faces) == 0:
        return 0

**user**: 机头的xy坐标一直在变化不存在问题,但是movement_direction 的值一直是 stopped

**chatgpt**: 如果机头的x,y坐标一直在变化,那么`movement_direction`的值应该不会一直是`stopped`。在这种情况下,可能是判断运动状态的代码存在问题。建议检查代码确保机头运动的判断逻辑正确。以下是一些可能会出现问题的部分以及一些解决方法:

1. 阈值不佳。如果使用的阈值太高或太低,就可能导致机头的运动状态被错误地检测或被忽略。建议根据数据的特点和需求来调整阈值。

2. 状态平滑处理不够充分。机头的运动方向在短时间内可能会出现突然的变化,但实际上可能不会完全改变方向。如果而使用大小为1的窗口,可能会造成不必要的错误反向计数。建议增加平滑处理,使用滑动窗口或其他方法来平滑状态变化。

3. 计数器不再更新。在连续反向运动被检测到后,需要将反向运动计数器更新为1。如果计数器在没有合适情况下没有重置,就可能导致后续计数器的计数一直累加,并可能导致错误的结果。

4. 判断阈值不够精确。机头运动的判断逻辑可能存在问题,可能无法准确检测到机头的运动状态。建议仔细检查并调整判断逻辑,以尽可能准确地检测运动状态。

**user**: 增加 钻杆统计变量 ,通过判断机头在10秒钟停止的次数来决定钻杆统计变量是否要增加数量

**chatgpt**: 如果要通过机头停止的次数来增加钻杆统计变量的数量,可以使用一个计数器来统计机头停止的次数。在每个时间步中,如果机头的运动状态为`stopped`,则将计数器增加1。然后,在10秒结束时,如果计数器大于或等于某个设定的阈值,则将钻杆统计变量增加1,然后将计数器重置为0,以便下一个10秒周期的计数。

以下是一个可能的示例代码:

```python
# 初始化变量
previous_x_coord = 0
previous_y_coord = 0
movement_direction = 'stopped'
reverse_motion_detected = False
reverse_motion_counter = 0
frame_counter = 0
stop_counter = 0
start_time = time.time()
drill_count = 0
DRILL_THRESHOLD = 3 # 设定一个阈值,达到该阈值后可以增加一次钻杆统计变量

# 创建一个滑动窗口列表,用于记录钻杆是否在运动
drill_window = [False] * 20

# 在视频的每个时间步计算机头在x轴和y轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)
        y_coord = get_head_center_y_coord(frame)

        # 计算机头中心点的位移
        distance = math.sqrt((x_coord - previous_x_coord)**2 + (y_coord - previous_y_coord)**2)

        # 根据位移的大小和方向来判断机头运动方向
        if distance > 10 and abs(x_coord - previous_x_coord) > abs(y_coord - previous_y_coord):
            if x_coord > previous_x_coord:
                movement_direction = 'forward'
            elif x_coord < previous_x_coord:
                movement_direction = 'backward'
            else:
                movement_direction = 'stopped'
        else:
            movement_direction = 'stopped'

        # 判断机头是否在运动中(合理运动阈值可以根据实际情况调整)
        if distance > 10:
            drill_window.append(True)
        else:
            drill_window.append(False)

        # 如果窗口满了,就移除最早的状态。
        if len(drill_window) > 20:
            drill_window.pop(0)

        # 如果窗口中有超过一半的状态为 True,则认为钻杆处于运动状态
        if drill_window.count(True) >= 10:
            drill_moving = True
        else:
            drill_moving = False

        # 如果机头停止运动,则增加停止计数器的值
        if movement_direction == 'stopped':
            stop_counter += 1
        else:
            stop_counter = 0

        # 如果机头停止了一段时间而且钻杆不在运动,增加反向运动计数器的值
        if stop_counter >= 10 and not drill_moving:
            reverse_motion_detected = True

        # 如果钻杆正在运动,则重置反向运动计数器的值
        if drill_moving:
            reverse_motion_detected = False

        # 如果存在反向运动而且已经连续5次或以上,增加钻杆统计变量
        if reverse_motion_detected and reverse_motion_counter >= 5:
            drill_count += 1
            reverse_motion_counter = 0
        elif not reverse_motion_detected:
            reverse_motion_counter += 1

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord
        previous_y_coord = y_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去10秒钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 10:
            # 如果机头停止的次数达到设定的阈值(可以根据实际情况调整),增加钻杆统计变量
            if stop_counter >= 5:
                drill_count += 1

            # 输出钻杆统计变量的数量,并重新计时和计数器
            print(f'Number of successful drilling operations: {drill_count}')
            drill_count = 0
            stop_counter = 0
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

在上述代码中,我们使用一个计数器来检查机头是否停止了一段时间,使用一个滑动窗口列表来判断钻杆是否在运动。如果机头停止了一段时间而且钻杆不在运动,则增加反向运动计数器的值。如果反向运动计数器达到5,说明发生了连续反向运动,钻杆统计计数器可以增加1。在10秒结束后,如果停止计数器达到一定阈值,钻杆计数器也可以增加1。

user: 取消y轴的影响,通过判断机头在2分钟内停机的次数来决定钻杆统计变量是否加增加

chatgpt: 如果要根据机头在2分钟内停机的次数来决定钻杆统计变量是否增加,您可以使用一个计数器来记录机头的停机次数。在每个时间步中,如果机头的运动状态为stopped,则将计数器增加1。在每个迭代完成后判断是否达到停机的阈值。如果达到阈值,则将钻杆统计变量增加1,并将计数器重置。

以下是一个可能的示例代码:

# 初始化变量
previous_x_coord = 0
movement_direction = 'stopped'
frame_counter = 0
stop_counter = 0
start_time = time.time()
drill_count = 0
DRILL_THRESHOLD = 5 # 设定一个阈值,达到该阈值后可以增加一次钻杆统计变量
STOP_THRESHOLD = 10 # 设定一个阈值,机头停止次数达到该阈值后可以增加一次钻杆统计变量

# 在视频的每个时间步计算机头在x轴的位置
for frame in video:
    frame_counter += 1

    # 如果计数器到达20,就进行判断
    if frame_counter == 20:
        x_coord = get_head_center_x_coord(frame)

        # 计算机头中心点的位移
        distance = abs(x_coord - previous_x_coord)

        # 根据位移的大小和方向来判断机头运动方向
        if distance > 10:
            if x_coord > previous_x_coord:
                movement_direction = 'forward'
            elif x_coord < previous_x_coord:
                movement_direction = 'backward'
            else:
                movement_direction = 'stopped'
        else:
            movement_direction = 'stopped'

        # 如果机头停止了,增加计数器的值
        if movement_direction == 'stopped':
            stop_counter += 1

        # 保存当前位置作为下一个时间步的前一个位置
        previous_x_coord = x_coord

        # 重置计数器
        frame_counter = 0

        # 判断是否已经过去2分钟
        elapsed_time = time.time() - start_time
        if elapsed_time >= 120:
            # 如果机头停止的次数达到设定的阈值,增加钻杆统计变量
            if stop_counter >= STOP_THRESHOLD:
                drill_count += 1

            # 如果机头停止次数达到设定的阈值,或者反向运动的次数达到设定的阈值,增加钻杆统计变量
            if stop_counter >= STOP_THRESHOLD or reverse_motion_counter >= DRILL_THRESHOLD:
                drill_count += 1
                stop_counter = 0
                reverse_motion_counter = 0

            # 输出钻杆统计变量的数量,并重新计时和计数器
            print(f'Number of successful drilling operations: {drill_count}')
            drill_count = 0
            stop_counter = 0
            reverse_motion_counter = 0
            start_time = time.time()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

上述代码中,在每个迭代完成后我们会检查机头是否停机。如果停机计数器在2分钟内达到指定的阈值,则增加钻杆统计变量的数量,并将计数器重置为0,以便下一个2分钟周期的计数。

判断机头在视频画面中的位置,来确定机头是从画面左边开始前进,还是从画面右边开始前进

更新时间: 2024/7/30 17:14:28