OpenCV在Python中 - 将ROI复制到新的更小图像

3 投票
1 回答
15897 浏览
提问于 2025-04-20 13:42

在使用Python的OpenCV库时,

我想知道怎么才能创建一张新图片,这张新图片只是从另一张图片中复制一个区域(roi)。

肯定有一些简单的方法,比如

Mat roi = img( Rect(x,y,w,h) );

或者有没有比直接复制更优雅的方式呢?

rect=[x,y,w,h]
img = cv2.imread(subst)
roi= np.zeros((rect[3],rect[2],3),np.uint8)  #is this really reversed? who ordered that?
cv2.rectangle(img,(x,y),(w+x,h+y),[255,0,0],thickness=1)
cv2.imshow('img',img)
cv2.waitKey()
#cv.Copy(cv.fromarray(img),cv.fromarray(roi),cv.fromarray(mask))  #can't make it work...
for x in range(rect[2]):
    for y in range(rect[3]):
        roi[y,x,:]=img[y+rect[1],x+rect[0],:]

顺便问一下,关于坐标的顺序,x和y的顺序是怎样的?是[x,y,c]还是[y,x,c]来指定一个点,其中x是水平坐标,y是垂直坐标?我觉得好像是[y,x,c],因为cv2.rectangle用的是(x,y),而img.shape是(y,x),这比颜色通道的顺序(g,r,b)和(r,g,b)还要让人困惑……

1 个回答

5

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据不完整。这就像是水桶里有个洞,水会漏掉,导致我们不能得到想要的结果。

为了避免这些问题,我们可以使用一些工具和方法来确保数据的质量。比如,我们可以检查数据的格式,确保它是我们需要的样子,就像在倒水之前先检查水桶有没有漏。

总之,处理数据的时候要小心,确保每一步都正确,这样才能得到我们想要的结果。

import os
import cv2

img = cv2.imread(filename)
roi = img[row:row+height,column:column+width]
cv2.imshow('ROI',roi)
cv2.waitKey(0)

撰写回答