注意:使用在线编译器在这里不起作用。请安装Python2.7x和cv2,argparse模块来实际试用这个例子。
对于我们大多数人来说,他们都是所有动作片、现代战争、黑色行动等游戏的忠实粉丝,有机会说“目标已锁定……等待批准”一直是我们的梦想。阿尔法小队,你可以开火了,任务开始了。让我们吹吧,伙计们!!!万岁!”当然,你不可能总是得到你想要的,但至少现在,我可以让你离梦想足够近。这节课你只需要Python2.7,cv2模块,如果你有一台好的录像机,在它的帮助下你可以获得实时视频流,那就太好了。不管怎样,就算你没有也没关系。
第一步:检查你的武器
下载Python2.7并确保您拥有cv2模块(请注意,cv模块很旧,已被cv2替换)和argparse模块。为此:
import cv2 as cvimport argparse
如果这没有给出一个错误,那么你就可以走了…
第2步:任务细节
现在你已经带上了武器,是时候确保你拥有所有需要的任务细节了。首先,我们需要明确我们的目标。因此,我们的目标是:
现在你已经有了目标,是时候建立一个测试场了。把目标打印出来,贴在家里的几个地方。现在,如果你真的想获得这种感觉,制作一架四轮直升机,在其中安装一个小摄像头,正确记录整个房子,并确保覆盖粘贴目标的地方。如果你不想经历这些麻烦,那就自己拿一个摄像头记录下你的房子。我建议你保持视频简短。
第三步:系好安全带!我们有任务要完成!
可以这里是Alpha 1值班报告!把任务坐标发给我们!
你有了目标,现在你需要获得它!为此,我们将使用计算机视觉模块(cv2)。代码片段:
直接代码链接: https://ide.geeksforgeeks.org/xfUet4
import argparseimport cv2# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-v", "--video", help="path to the video file")args = vars(ap.parse_args())# load the videocamVideo = cv2.VideoCapture(args["video"])# keep loopingwhile 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 contoursfor 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 windowscamVideo.release()cv2.destroyAllWindows()
代码说明:
我们在录制的视频的每一帧上循环,为了检测我们的目标,我们将其转换为灰度,模糊它,最后使用canny边缘检测方法找到轮廓图像。
记住这一点,camVideo。read()将返回一个元组,第一个元素指定帧是否被成功读取,第二个元素是我们将处理的实际帧!
现在,一旦你有了框架,我们将使用轮廓近似,然后检查从上一步获得的输出中的元素数量。如果元素的数量是5,那么我们就有了我们正在寻找的常规五角大楼,因此我们更新了状态。
这一切都很简单,很基本。如果你真的想建立一个这样的程序,那么你应该看看各种过滤器,以消除噪音影响的帧,以获得更准确的结果。你能做的最好的事情就是继续尝试!
在你家试试这个练习,录下视频并与我们分享你的结果…
签字!和平!保持安全
关于作者:
维什韦什·施里马里 是BITS Pilani大学机械工程专业的本科生。他满足了他所在部门没有教过的所有要求——白帽黑客、网络安全运营商,以及一位前竞争对手程序员。作为Python强大功能的坚定信徒,他的大部分工作都是用同一种语言完成的。每当他有时间除了编程、上课、看CSI网络之外,他就会去散步,默默地弹吉他。他的人生座右铭是:“享受生活,因为它值得享受!”
如果你也想在这里展示你的博客,请参见 吉微博 在Geeksforgek上写客博。