1. <small id='FEWen'></small><noframes id='FEWen'>

  2. <legend id='FEWen'><style id='FEWen'><dir id='FEWen'><q id='FEWen'></q></dir></style></legend><tfoot id='FEWen'></tfoot>

    • <bdo id='FEWen'></bdo><ul id='FEWen'></ul>

      <i id='FEWen'><tr id='FEWen'><dt id='FEWen'><q id='FEWen'><span id='FEWen'><b id='FEWen'><form id='FEWen'><ins id='FEWen'></ins><ul id='FEWen'></ul><sub id='FEWen'></sub></form><legend id='FEWen'></legend><bdo id='FEWen'><pre id='FEWen'><center id='FEWen'></center></pre></bdo></b><th id='FEWen'></th></span></q></dt></tr></i><div id='FEWen'><tfoot id='FEWen'></tfoot><dl id='FEWen'><fieldset id='FEWen'></fieldset></dl></div>

      如何使用OpenCV检测图像帧中的对象?

      How can I detect an object in image frame using OpenCV?(如何使用OpenCV检测图像帧中的对象?)

      <i id='f5GYN'><tr id='f5GYN'><dt id='f5GYN'><q id='f5GYN'><span id='f5GYN'><b id='f5GYN'><form id='f5GYN'><ins id='f5GYN'></ins><ul id='f5GYN'></ul><sub id='f5GYN'></sub></form><legend id='f5GYN'></legend><bdo id='f5GYN'><pre id='f5GYN'><center id='f5GYN'></center></pre></bdo></b><th id='f5GYN'></th></span></q></dt></tr></i><div id='f5GYN'><tfoot id='f5GYN'></tfoot><dl id='f5GYN'><fieldset id='f5GYN'></fieldset></dl></div>
    1. <tfoot id='f5GYN'></tfoot>

          • <bdo id='f5GYN'></bdo><ul id='f5GYN'></ul>

              <legend id='f5GYN'><style id='f5GYN'><dir id='f5GYN'><q id='f5GYN'></q></dir></style></legend>

                <small id='f5GYN'></small><noframes id='f5GYN'>

                  <tbody id='f5GYN'></tbody>

              • 本文介绍了如何使用OpenCV检测图像帧中的对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我正在开发一款使用覆盆子PI的漫游车,它将清扫房间并捡起掉在地上的物体。为了检测对象,我使用的是在漫游车操作开始时拍摄的参考图像,以及每10秒单击一次的图像(新图像)。为了确定图像边框是否有变化,我在参考图像和新图像之间进行了图像减法。如果发现任何不同之处,它将在它周围画一条轮廓,如果轮廓面积大于某个阈值(警告步骤),它就会得出结论,认为存在一个物体。

                我使用以下代码-

                import numpy as np
                import cv2,time
                
                img=cv2.imread("object1.jpg")
                img1=cv2.imread("object2.jpg")
                sub=cv2.subtract(img,img1)
                
                gray=cv2.cvtColor(sub,cv2.COLOR_BGR2GRAY)
                blur = cv2.GaussianBlur(gray,(3,3),0)
                _, contours, _= cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
                c=max(contours,key=cv2.contourArea)
                print(cv2.contourArea(c))
                
                if cv2.contourArea>20000:
                   print("Object detected !")
                

                以上代码仅使用2张图像来计算它们之间的差异,并确定是否存在对象。请注意,我尚未在此处发布我将在项目中使用的原始代码。

                现在,上面的代码可以很好地用于非常受控制的情况,比如图像背景非常恒定或者其中没有阴影。但考虑到漫游车将在房间内四处移动,并且即使帧中没有真实对象,照明变化也有可能触发错误的对象检测。该差异可能由于来自阴影效果的错误轮廓而被触发。

                我想知道,是否有其他方法可以在不进行前景/背景图像减去的情况下实现该对象检测。我也考虑过使用超声波传感器来检测物体的存在,但这不是一个非常可靠的选择。我更喜欢基于图像处理的解决方案。

                谢谢您。

                ==

                编辑1-

                所以,我决定稍微修改一下算法。我对前景和背景图像都做了阈值处理,然后在二值图像之间进行了缺席,以获得任何帧变化(对象)。 代码如下-

                import numpy as np
                import cv2,time
                
                img1=cv2.imread("back.jpeg")
                blur1 = cv2.GaussianBlur(img1,(5,5),0)
                gray1=cv2.cvtColor(blur1,cv2.COLOR_BGR2GRAY)
                ret,thresh1 = cv2.threshold(gray1,65,255,cv2.THRESH_BINARY_INV)
                
                img2=cv2.imread("front.jpeg")
                blur2 = cv2.GaussianBlur(img2,(5,5),0)
                gray2=cv2.cvtColor(blur2,cv2.COLOR_BGR2GRAY)
                ret,thresh2 = cv2.threshold(gray2,65,255,cv2.THRESH_BINARY_INV)
                
                diff=cv2.absdiff(thresh2,thresh1)
                diff=cv2.bitwise_xor(diff,thresh1)
                
                kernel = np.ones((2,2),np.uint8)
                diff=cv2.erode(diff,kernel,iterations = 1)
                diff=cv2.dilate(diff,kernel,iterations = 8)
                
                _, contours, _= cv2.findContours(diff,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
                c=max(contours,key=cv2.contourArea)
                x,y,w,h = cv2.boundingRect(c)
                cv2.rectangle(diff,(x,y),(x+w,y+h),(125,125,125),2)
                
                
                cv2.imshow("thresh",diff)
                cv2.waitKey(0)
                

                "缺席"之后是侵蚀和膨胀。然后,我找出最大的轮廓线,并确定是否有物体。算法中使用的图像如下-

                1. 背景图- Background Image

                2. 前景图像-Foreground image

                3. 前台阈值-Foreground threshold Image

                4. 背景阈值-Background threshold Image

                5. 差异图像-Final Image with contour and its boundary .

                如您所见,检测工作正常。我几乎没有其他用于测试算法的前景图像。他们取得了令人满意的结果。我想知道,有没有其他方法可以更有效地达到同样的效果。

                PS-所有前景图像都是在打开闪存的情况下拍摄的。我已尝试关闭Flash,但图像中似乎存在大量噪音。

                ==

                编辑2-

                使用其他图片的算法性能-

                注意:-背景图像保持不变。

                1. 对象1-Foreground Image 1
                2. 对象1检测-Foreground Image 1 Result

                推荐答案

                我怀疑这个问题是否像您在问题中描述的那么简单,当我们进入现实世界的场景时,它会变得非常复杂。

                但无论如何,假设您的小对象只出现在房间中,那么您可以通过识别捕获的二进制图像中的连接组件并根据它们的相对像素大小选择它们来识别它们。

                下面是相同的Python实现:

                img = cv2.imread('D:/Image/objects.jpg')
                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                # binarize the image
                ret, bw = cv2.threshold(gray, 128, 255, 
                cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
                
                # find connected components
                connectivity = 4
                nb_components, output, stats, centroids = 
                cv2.connectedComponentsWithStats(bw, connectivity, cv2.CV_32S)
                sizes = stats[1:, -1]; nb_components = nb_components - 1
                min_size = 250 #threshhold value for objects in scene
                img2 = np.zeros((img.shape), np.uint8)
                for i in range(0, nb_components+1):
                    # use if sizes[i] >= min_size: to identify your objects
                    color = np.random.randint(255,size=3)
                    # draw the bounding rectangele around each object
                    cv2.rectangle(img2, (stats[i][0],stats[i][1]),(stats[i][0]+stats[i][2],stats[i][1]+stats[i][3]), (0,255,0), 2)
                    img2[output == i + 1] = color
                

                包含对象的图像:

                使用连接的组件标签检测到的对象:

                这篇关于如何使用OpenCV检测图像帧中的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                GUI Freezes while downloading PyQt5 and Pytube(GUI在下载PyQt5和Pytube时冻结)
                How to solve memory issues while multiprocessing using Pool.map()?(如何解决使用Pool.map()进行多处理时的内存问题?)
                Python - How to use FastAPI and uvicorn.run without blocking the thread?(Python-如何使用FastAPI和uvicorn.run而不阻塞线程?)
                How to increment a shared counter from multiple processes?(如何从多个进程递增共享计数器?)
                Using pika, how to connect to rabbitmq running in docker, started with docker-compose with external network?(使用pika,如何连接运行在docker中的rabbitmq,从docker开始-与外部网络连接?)
                How to use .rolling() on each row of a Pandas dataframe?(如何对 pandas 数据帧的每一行使用.roll()?)

                <small id='a4G6G'></small><noframes id='a4G6G'>

              • <tfoot id='a4G6G'></tfoot><legend id='a4G6G'><style id='a4G6G'><dir id='a4G6G'><q id='a4G6G'></q></dir></style></legend>

                    <bdo id='a4G6G'></bdo><ul id='a4G6G'></ul>

                      <tbody id='a4G6G'></tbody>

                  • <i id='a4G6G'><tr id='a4G6G'><dt id='a4G6G'><q id='a4G6G'><span id='a4G6G'><b id='a4G6G'><form id='a4G6G'><ins id='a4G6G'></ins><ul id='a4G6G'></ul><sub id='a4G6G'></sub></form><legend id='a4G6G'></legend><bdo id='a4G6G'><pre id='a4G6G'><center id='a4G6G'></center></pre></bdo></b><th id='a4G6G'></th></span></q></dt></tr></i><div id='a4G6G'><tfoot id='a4G6G'></tfoot><dl id='a4G6G'><fieldset id='a4G6G'></fieldset></dl></div>