gpt4 book ai didi

python - 在OpenCV中随图像移动的增强现实线

转载 作者:行者123 更新时间:2023-12-02 17:58:09 26 4
gpt4 key购买 nike

我想在openCV中做以下事情。我的问题陈述与瓶子有关,瓶子需要在图像上有一条直线,并且该直线需要根据瓶子的运动而旋转。
The first image should look like this, where the red lines are the borders
The second image should look like this, where the red lines dont move but the green line moves as the bottle rotates
Finally the application needs to be killed when the green line gets alligned to the left red line
第一张图片需要以红线为边界并启动绿线
旋转瓶子时,第二个图像的中间需要有绿线。那是绿线必须跟随瓶子的旋转
最后,按照第三张图片,当绿线变成红线时,应用程序需要杀死自己或保存图片
我尝试使用模板匹配在OpenCV中执行此操作。我尝试保留模板图像,然后使用模板匹配算法跟踪模板图像。但是在这种情况下,它似乎无法正常工作。

import cv2
from time import sleep
import numpy as np

vid = cv2.VideoCapture(0)
sleep(2)
line_show = False
save_reference = False
template_compare_method = cv2.TM_SQDIFF_NORMED
i = 0

while True:

check, frame = vid.read()

print(check)
frame1 = cv2.line(frame, (500, 0), (500, 720), (255, 0, 0), 7)
frame1 = cv2.line(frame1, (800, 0), (800, 720), (255, 0, 0), 7)

if line_show:
h, w = frame1.shape[:2]
if not save_reference:
reference = frame1[200:500, 780:790]
cv2.imwrite("../../images/white_image.jpg", reference)
save_reference = True
if save_reference:
reference_image = cv2.imread('../../images/white_image.jpg')
result = cv2.matchTemplate(reference_image, frame1, template_compare_method)
mn, _, mnLoc, _ = cv2.minMaxLoc(result)
MPx, MPy = mnLoc
trows, tcols = reference_image.shape[:2]
frame1 = cv2.rectangle(frame1, (MPx, MPy), (MPx+tcols, MPy+trows), (0, 0, 255), 2)

cv2.imshow("image", frame1)
key = cv2.waitKey(1)
if key == ord('l'):
line_show = True
if key == ord('k'):
cv2.imwrite("../../images/saved_image_"+str(i)+".jpg", frame1)
i = i + 1
if key == ord('s'):
cv2.imwrite("../../images/saved_image.jpg", frame)
vid.release()
print("Image saved")
break

elif key == ord('q'):
vid.release()
cv2.destroyAllWindows()
break

我可以使用任何其他算法,还是将其视为对象跟踪任务,从而在其中保存一幅小图像并通过模板匹配对其进行跟踪,从而以错误的方式解决了此问题?
我可以使用其他一些算法,例如Meanshift,Frame Difference等来实现这一目标吗?

最佳答案

如果您是我,可以使用line算法解决此问题。当然,您可以选择任何其他健壮的算法。我的想法是尽快解决问题。
假设我有以下带有左右边界(蓝色)的图像,并且我有绿线。
enter image description here
绿线通过左边界时,退出。
enter image description here enter image description here


  • 跟踪green-line
  • 首先,您需要找到框架的功能,以有效地跟踪绿线。
    while True:
    ret, frm = cap.read()
    frm_gry = cv2.cvtColor(frm, cv2.COLOR_BGR2GRAY)
    frm_cny = cv2.Canny(frm_gry, 50, 200)
    样本输出:
    enter image description here
  • 其次,找到绿线的大致长度:
  • 没有直接找到长度的方法,而是要进行错误尝试计算。
  • 确定后,初始化line算法。
    lns = cv2.ximgproc.createFastLineDetector(_length_threshold=400).detect(frm_cny)

  • 第三,获取坐标,并检查绿线是否在边框中。
    if lns is not None:
    for ln in lns:
    x1 = int(ln[0][0])
    y1 = int(ln[0][1])
    x2 = int(ln[0][2])
    y2 = int(ln[0][3])

    if x1 <= 232:
    break



  • 码:
    import cv2

    cap = cv2.VideoCapture("sample.mp4")

    while True:
    ret, frm = cap.read()

    if ret:
    rgt_bdr = cv2.line(frm, (794, 250), (794, 1250), (255, 0, 0), 7)
    lft_bdr = cv2.line(frm, (232, 250), (232, 1250), (255, 0, 0), 7)

    frm_gry = cv2.cvtColor(frm, cv2.COLOR_BGR2GRAY)
    frm_cny = cv2.Canny(frm_gry, 50, 200)

    lns = cv2.ximgproc.createFastLineDetector(_length_threshold=400).detect(frm_cny)

    if lns is not None:
    for ln in lns:
    x1 = int(ln[0][0])
    y1 = int(ln[0][1])
    x2 = int(ln[0][2])
    y2 = int(ln[0][3])

    cv2.line(frm,
    pt1=(x1, y1),
    pt2=(x2, y2),
    color=(0, 255, 0),
    thickness=3)

    print("({}, {})-({}, {})".format(x1, y1, x2, y2))

    if x1 <= 232:
    break

    cv2.imshow("frm", frm)
    cv2.waitKey(1)

    关于python - 在OpenCV中随图像移动的增强现实线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64279068/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com