Python 在循环中覆盖
我是Python和OpenCV编码的初学者,我的程序有问题。我的目标是探测轨道上的任何障碍物。为了实现这个项目,我使用了一个函数来代替背景。起初,我有一个背景和不同的照片,上面有一个训练障碍。但有些带有障碍物的照片与我的背景不匹配 这就是为什么我决定拍摄不同的背景照片。我们的想法是创建一个代码,在不同的背景下进行减法运算,直到它真正起作用。这里有一个例子:我有一张有物体的照片。代码将用对象替换照片中的第一个背景。如果它不起作用(代码在此应用程序之后没有检测到对象),那么它将在第二个背景中重试,以此类推 一旦它将从照片中找到正确的背景以替换对象(这意味着代码将返回对象周围带有矩形的原始照片),那么它将停止。当然,我们不需要尝试其他的后卫,因为我们现在已经有了一个好的结果 所以我的问题是:我试图用下面的代码来做这件事,但它不起作用。例如,对于带有对象的照片,如果特定背景起作用,那么如果(第22行)的循环开始处理该背景,它将起作用,因为循环将在第一次迭代之后停止。但是,如果这个背景在第二次迭代或更多次迭代中,那么它就不再工作了。我认为每次我在这个循环中再次返回时,我都会覆盖我创建的最后一帧。我的意思是,在第二次迭代中,我不是从“有物体的照片”中减去“backgorund 2”,而是从“有物体和背景的照片1”中减去“backgorund 2”,或者类似的东西。我不是100%确定,但这是一个假设 如果有人能告诉我为什么它不起作用,我将非常感激 这是我的密码:Python 在循环中覆盖,python,opencv,Python,Opencv,我是Python和OpenCV编码的初学者,我的程序有问题。我的目标是探测轨道上的任何障碍物。为了实现这个项目,我使用了一个函数来代替背景。起初,我有一个背景和不同的照片,上面有一个训练障碍。但有些带有障碍物的照片与我的背景不匹配 这就是为什么我决定拍摄不同的背景照片。我们的想法是创建一个代码,在不同的背景下进行减法运算,直到它真正起作用。这里有一个例子:我有一张有物体的照片。代码将用对象替换照片中的第一个背景。如果它不起作用(代码在此应用程序之后没有检测到对象),那么它将在第二个背景中重试,以
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()
以下是一些照片:
背景:
对象:
您忘了密码是的,谢谢!现在没事了:)