Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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
使用OpenCV Python提取所有边界框_Python_Opencv_Extraction_Bounding Box - Fatal编程技术网

使用OpenCV Python提取所有边界框

使用OpenCV Python提取所有边界框,python,opencv,extraction,bounding-box,Python,Opencv,Extraction,Bounding Box,我有一个包含多个边界框的图像。 我需要提取所有包含边界框的内容。到目前为止,我从这个网站得到了以下答案: y = img[by:by+bh, bx:bx+bw] cv2.imwrite(string + '.png', y) 它是有效的,但是它只得到一个。我应该如何修改代码?我试着将它放入轮廓的循环中,但它仍然会输出一个图像,而不是多个图像 提前非常感谢。好了: import cv2 im = cv2.imread('c:/data/ph.jpg') gray=cv2.cvtColor(i

我有一个包含多个边界框的图像。

我需要提取所有包含边界框的内容。到目前为止,我从这个网站得到了以下答案:

y = img[by:by+bh, bx:bx+bw]
cv2.imwrite(string + '.png', y)
它是有效的,但是它只得到一个。我应该如何修改代码?我试着将它放入轮廓的循环中,但它仍然会输出一个图像,而不是多个图像

提前非常感谢。

好了:

import cv2

im = cv2.imread('c:/data/ph.jpg')
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
contours, hierarchy = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[-2:]
idx =0 
for cnt in contours:
    idx += 1
    x,y,w,h = cv2.boundingRect(cnt)
    roi=im[y:y+h,x:x+w]
    cv2.imwrite(str(idx) + '.jpg', roi)
    #cv2.rectangle(im,(x,y),(x+w,y+h),(200,0,0),2)
cv2.imshow('img',im)
cv2.waitKey(0)    

一种简单的方法是找到所有轮廓,使用cv2.boundingRect获得边界矩形坐标,然后使用Numpy切片提取ROI。我们可以保留一个计数器来保存每个ROI,然后使用
cv2.imwrite
保存它。下面是一个工作示例:

输入图像:

检测到要提取的ROI以绿色突出显示

节省的ROI

代码


如果上述代码出现以下错误,ValueError:too many values to unpack(预期为2),请更改以下行:轮廓、层次结构、=cv2.findContours(灰色、cv2.RETR\u LIST、cv2.CHAIN\u近似值\u SIMPLE)请修复代码中的错误,即使我有上述相同的错误
import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold 
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours, obtain bounding box, extract and save ROI
ROI_number = 0
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
    ROI_number += 1

cv2.imshow('image', image)
cv2.waitKey()