Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中覆盖_Python_Opencv - Fatal编程技术网

Python 在循环中覆盖

Python 在循环中覆盖,python,opencv,Python,Opencv,我是Python和OpenCV编码的初学者,我的程序有问题。我的目标是探测轨道上的任何障碍物。为了实现这个项目,我使用了一个函数来代替背景。起初,我有一个背景和不同的照片,上面有一个训练障碍。但有些带有障碍物的照片与我的背景不匹配 这就是为什么我决定拍摄不同的背景照片。我们的想法是创建一个代码,在不同的背景下进行减法运算,直到它真正起作用。这里有一个例子:我有一张有物体的照片。代码将用对象替换照片中的第一个背景。如果它不起作用(代码在此应用程序之后没有检测到对象),那么它将在第二个背景中重试,以

我是Python和OpenCV编码的初学者,我的程序有问题。我的目标是探测轨道上的任何障碍物。为了实现这个项目,我使用了一个函数来代替背景。起初,我有一个背景和不同的照片,上面有一个训练障碍。但有些带有障碍物的照片与我的背景不匹配

这就是为什么我决定拍摄不同的背景照片。我们的想法是创建一个代码,在不同的背景下进行减法运算,直到它真正起作用。这里有一个例子:我有一张有物体的照片。代码将用对象替换照片中的第一个背景。如果它不起作用(代码在此应用程序之后没有检测到对象),那么它将在第二个背景中重试,以此类推

一旦它将从照片中找到正确的背景以替换对象(这意味着代码将返回对象周围带有矩形的原始照片),那么它将停止。当然,我们不需要尝试其他的后卫,因为我们现在已经有了一个好的结果

所以我的问题是:我试图用下面的代码来做这件事,但它不起作用。例如,对于带有对象的照片,如果特定背景起作用,那么如果(第22行)的循环开始处理该背景,它将起作用,因为循环将在第一次迭代之后停止。但是,如果这个背景在第二次迭代或更多次迭代中,那么它就不再工作了。我认为每次我在这个循环中再次返回时,我都会覆盖我创建的最后一帧。我的意思是,在第二次迭代中,我不是从“有物体的照片”中减去“backgorund 2”,而是从“有物体和背景的照片1”中减去“backgorund 2”,或者类似的东西。我不是100%确定,但这是一个假设

如果有人能告诉我为什么它不起作用,我将非常感激

这是我的密码:

import numpy as np
import cv2
import sys
from time import gmtime, strftime
import time
import os

dirname=str(strftime("%Y-%m-%d %H-%M-%S", time.localtime()))
newpath = "%s" %dirname
if not os.path.exists(newpath):
    os.makedirs(newpath)

# both MOG and MOG2 can be used, with different parameter values
backgroundSubtractor = cv2.bgsegm.createBackgroundSubtractorMOG()

# apply the algorithm for background images using learning rate > 0

for i in range(1, 10):
    bgImageFile = "background%s.jpg" % i
    print ("Opening background", bgImageFile)
    bg = cv2.imread(bgImageFile)
    backgroundSubtractor.apply(bg)

# apply the algorithm for detection image using learning rate 0
    stillFrame = cv2.imread("object1.jpg")
    fgmask = backgroundSubtractor.apply(stillFrame, learningRate=0)

    cv2.imwrite('%s/fgmask.jpg' %dirname, fgmask)
    img1 = cv2.imread('%s/fgmask.jpg' %dirname)

    gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
    ret,th2 = cv2.threshold(gray,100,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    morphed = th2.copy()
    morphed = cv2.morphologyEx(morphed, cv2.MORPH_ERODE, kernel, iterations=5)
    morphed1 = cv2.morphologyEx(morphed, cv2.MORPH_DILATE, kernel, iterations=17)

    cv2.namedWindow("image", cv2.WINDOW_NORMAL)
    cv2.resizeWindow("image", 1000, 700)
   cv2.imshow("image", morphed1)

    _, contours,_ = cv2.findContours(morphed1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    contours = list(filter(lambda cnt: cv2.contourArea(cnt) > 10000 and cv2.arcLength(cnt,True) > 1000, contours))

    for cnt in contours:
        print("aire = ", cv2.contourArea(cnt))
        print("perimetre = ", cv2.arcLength(cnt,True))
        rect = cv2.minAreaRect(cnt)
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        cv2.drawContours(stillFrame,[box],0,(0,255,255),10)

    if len(contours)>0:
        break


# show both images
cv2.namedWindow("image1", cv2.WINDOW_NORMAL)
cv2.resizeWindow("image1", 1000, 700)
cv2.imshow("image1", img1)
cv2.namedWindow("image2", cv2.WINDOW_NORMAL)
cv2.resizeWindow("image2", 1000, 700)
cv2.imshow("image2", stillFrame)
cv2.waitKey()
cv2.destroyAllWindows()
以下是一些照片:

背景:

对象:


您忘了密码是的,谢谢!现在没事了:)