Python 剪切并保存通过颜色识别的对象
所以我想做一个程序,可以通过颜色、位置和清晰度来检测物体。 现在我在那里,我可以通过颜色检测对象,并绘制其轮廓和边界框。 我的问题是,当程序识别出物体的轮廓或边界框时,我真的不知道如何从图片中剪切出物体并将其保存为图片文件 这是我的相机看到的照片 我想将绿色边界框内的内容剪切成视频中fps的倍,只要你能在视频中看到它。因此,如果视频速度为30 fps,且物体在10秒内可见,则需要拍摄300张照片。 代码如下: 我知道这看起来很糟糕,我只是想弄清楚用什么来让它工作Python 剪切并保存通过颜色识别的对象,python,opencv,Python,Opencv,所以我想做一个程序,可以通过颜色、位置和清晰度来检测物体。 现在我在那里,我可以通过颜色检测对象,并绘制其轮廓和边界框。 我的问题是,当程序识别出物体的轮廓或边界框时,我真的不知道如何从图片中剪切出物体并将其保存为图片文件 这是我的相机看到的照片 我想将绿色边界框内的内容剪切成视频中fps的倍,只要你能在视频中看到它。因此,如果视频速度为30 fps,且物体在10秒内可见,则需要拍摄300张照片。 代码如下: 我知道这看起来很糟糕,我只是想弄清楚用什么来让它工作 专注于这个问题而忽略代码风格
专注于这个问题而忽略代码风格,我可以说您已经接近实现目标了:) 要裁剪对象,可以使用Mat copyTo方法。这是一张照片,这是一张照片 现在,对于从轮廓创建遮罩,可以使用与已使用的drawCountours方法相同的方法,但为厚度参数提供负值(例如,厚度=CV_填充)。您可以在此中看到一个代码段,并在o中检查详细信息 用于将映像保存到磁盘,您可以使用 因此,简而言之,将填充轮廓绘制到遮罩上,并使用该遮罩仅将对象像素从视频帧复制到另一个可以保存磁盘的垫子上
与其发布代码,我将与大家分享这篇文章,其中可能有您正在寻找的代码片段。Hi@Cerberus,请继续努力,您已经非常接近了!您缺少的是获取轮廓并创建遮罩,以便仅从帧复制对象像素。我在其他帖子和文档中发布了一个答案。也可以使用边框进行裁剪,如中所示。让我知道这是否有效,我也可以编辑我的答案来帮助你。谢谢你的帮助,我对此表示感谢。我是python新手,这些链接和代码帮助很大(节省了大量时间)。“如果我能实现它们,我会写信的。”迪奥戈斯利马感谢你的帮助。现在我可以将对象写入磁盘。我的问题是,我想将这些图像保存到当前工作目录中的指定文件夹中,但“os.path.join”无法正常工作。所以我想将它们保存到/os.getcwd()/data/。我想我有语法错误。嗨@Cerberus,我对你的代码的快速阅读让我怀疑这是否只是一个路径警告。你试过->cv.imwrite(os.path.join(“/data/”),outfile),裁剪过的图片吗?
import cv2 as cv
import numpy as np
import os
import uuid
cap = cv.VideoCapture(1)
font = cv.FONT_HERSHEY_COMPLEX
path = os.getcwd()
print(path)
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print('Error: Creating directory. ' + directory)
createFolder("./data")
# folderName = '%s' % (str(uuid.uuid4()))
while cap.isOpened():
_, frame = cap.read()
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# blue is the chosen one for now
lower_color = np.array([82, 33, 39])
upper_color = np.array([135, 206, 194])
mask = cv.inRange(hsv, lower_color, upper_color)
kernel = np.ones((5, 5), np.uint8)
mask = cv.erode(mask, kernel)
contours, hierarchy = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# find contour
for contour in contours:
area = cv.contourArea(contour)
x, y, h, w = cv.boundingRect(contour)
if area > 100:
# bounding box
# cv.rectangle(frame, (x - 40, y - 30), (x + h * 3, y + w * 3), (0, 255, 0), 1)
# cutting and saving
ext_left = tuple(contour[contour[:, :, 0].argmin()][0] - 20)
ext_right = tuple(contour[contour[:, :, 0].argmax()][0] + 20)
ext_top = tuple(contour[contour[:, :, 1].argmin()][0] - 20)
ext_bot = tuple(contour[contour[:, :, 1].argmax()][0] + 20)
outfile = '%s.jpg' % (str(uuid.uuid4()))
cropped_image = frame[ext_top[1]:ext_bot[1], ext_left[0]:ext_right[0]]
# write images to a specified folder
cv.imwrite(os.path.join(path, "/data/", outfile), cropped_image)
# outputs
cv.imshow("Frame", frame)
cv.imshow("Mask", mask)
key = cv.waitKey(1)
if key == 27:
break
cap.release()
cv.destroyAllWindows()