注意:在这里使用在线编译器是行不通的。请安装Python 2.7x 和 cv2、argparse 模块以实际试用此示例。
对于我们大多数人来说,他们是所有动作电影和现代战争、黑色行动等游戏的忠实粉丝,有机会说“目标获得了……等待批准”一直是一个梦想。团队阿尔法你被允许开火,任务是成功的。让我们吹吧伙计们!!!欢呼!”当然,好吧,你不可能总是得到你想要的——但是,至少现在,我可以让你离梦想足够近。这节课你只需要Python 2.7 和 cv2 模块,如果你有一个不错的录像机,借助它可以获得实时视频流,那就太好了。无论如何,即使没有也没关系。
第 – 1 步:检查你的武器
下载Python 2.7 并确保您有 cv2 模块(请注意 cv 模块是旧的并且已被 cv2 替换)和 argparse 模块。为了这 :
import cv2 as cv
import argparse
如果这没有出现错误,那么您就可以开始了……
步骤 – 2 : 任务详情
现在您已经拥有了武器,是时候确保您拥有所需的所有任务细节了。首先,我们需要指定我们的目标。所以,我们的目标是:
现在您有了目标,是时候设置测试场了。获取目标的多个打印输出并将其粘贴在您家中的多个位置。现在,如果您真的想感受一下,请制作一个四轴飞行器,在其中安装一个小相机,并正确记录整个房屋并确保您覆盖了粘贴目标的地方。如果您不想经历所有这些麻烦,只需拿起相机并自己记录您的房屋。我建议你保持视频简短。
第 3 步:系好安全带!我们有一个任务要完成!
好的。这是Alpha 1值班!把任务坐标发给我们!
你有了目标,现在你需要获得它!因此,为此我们将使用计算机视觉模块(cv2)。代码片段:
直接代码链接:https://ide.geeksforgeeks.org/xfUet4
import argparse
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", help="path to the video file")
args = vars(ap.parse_args())
# load the video
camVideo = cv2.VideoCapture(args["video"])
# keep looping
while True:
# grab the current frame and initialize the status text
(grabbed, frame) = camVideo.read()
status = "No Target in sight"
# check to see if we have reached the end of the
# video
if not grabbed:
break
# convert the frame to grayscale, blur it, and detect edges
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #grayscale
blurred = cv2.GaussianBlur(gray, (7, 7), 0) #blur
edged = cv2.Canny(blurred, 50, 150) #canny edge detection
# find contours in the edge map
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
# loop over the contours
for cnt in cnts:
approx=cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),
True)
if len(approx)==5:
cv2.drawContours(frame, [approx], -1, (0, 0, 255), 4)
status = "Target(s) in sight!"
# draw the status text on the frame
cv2.putText(frame, status, (20, 30), cv2.FONT_HERSHEY_SIMPLEX,
0.5,(0, 0, 255), 2)
# show the frame and record if a key is pressed
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the 's' key is pressed, stop the loop
if key == ord("s"):
break
# cleanup the input recorded video and close any open windows
camVideo.release()
cv2.destroyAllWindows()
代码解释:
我们循环记录视频的每一帧,为了检测我们的目标,我们将其转换为灰度,对其进行模糊处理,最后使用精明的边缘检测方法来找到轮廓图像。
请记住,camVideo.read() 将返回一个元组,其中第一个元素指定帧是否已成功读取,第二个元素是我们将处理的实际帧!
现在,一旦你有了框架,我们将使用轮廓近似,然后检查从上一步获得的输出中的元素数量。如果元素的数量是 5,那么我们就有了我们正在寻找的正五边形,因此我们更新状态。
现在这一切都非常简单和基本。如果您真的想构建一个这样的程序,那么您应该查看各种过滤器以去除帧中的噪声影响以获得更准确的结果。你能做的最好的事情就是不断尝试!
在您家尝试此练习,录制视频并与我们分享您的结果……
签收!和平!保持安全🙂
关于作者:
Vishwesh Shrimali是 BITS Pilani 机械工程专业的本科生。他满足了他的分支机构中没有教过的所有要求——白帽黑客、网络安全运算符和前竞争程序员。作为Python力量的坚定信仰者,他的大部分工作都使用同一种语言。每当他在编程、上课、观看 CSI Cyber 之余有一些时间时,他都会走很长一段路,默默地弹吉他。他的人生格言是——“享受你的生活,因为它值得享受!”
如果您还想在这里展示您的博客,请参阅 GBlog,了解 GeeksforGeeks 上的客座博客写作。