Python opencv裁剪不起作用

时间:2013-06-05 12:35:22

标签: opencv python-2.7 crop

我对OpenCV比较陌生。我从教程中收集到了这些内容,您可以使用此脚本进行裁剪:

import cv2
import numpy as np
import video

cam = cv2.VideoCapture(0)
ret,vis = cam.read()    
crop = vis[100:400, 100:300]    
cv2.imshow("Img",vis)
cv2.imshow("Crop",crop)    
cv2.waitKey(0)

这很好用。我没有错。

然而,当我把它放入我的主脚本时,它不起作用,我已经缩小到这部分代码:

def PicTake(self):
    ret,vis = self.cam.read()
    x1,y1 = self.selection[0]
    x2,y2 = self.selection[1]
    a = 0
    taken = 0
    while taken == 0:
        if cv2.imread("C:\Python27\opencv\samples\python2\Major\Test"+str(a)+".png") == None:
            crop = vis[x1:y1, x2:y2]
            print crop
            cv2.imshow("crop",crop)
            cv2.imwrite("C:\Python27\opencv\samples\python2\Major\Test"+str(a)+".png",crop)
            taken = 1
        else:
            a+=1
    return ("Picture Taken")

其中self.selection只是两个元组[(x1,y1),(x2,y2)]的列表。在第一个if语句之后,print crop返回“[]”并返回空列表。

所以是的,为什么它适用于数字和其他情况很好,但不是在这里?!

非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

vis只是一个numpy数组 检查print vis.shape的结果以检查输入图像的尺寸 在彩色图像的情况下,这将是这样的:

(367, 550, 3)

代表heightwidthcolor depth的维度。· 因此,如果要在x2> x1和y2> y1时选择从(x1,y1)到(x2,y2)的部分:

vis[y1:y2, x1:x2]

这也将涵盖深度维度 请注意,如果y2<y1x2<x1,则结果为空数组。

答案 1 :(得分:1)

你需要使用

crop = vis[y1:y2,x1:x2]

请参阅this answer以获取详细说明。

还检查相机是否实际输出了任何东西。在行之后

ret, vis = self.cam.read()

添加这些行

if not ret:
 print 'No captured images'

答案 2 :(得分:0)

裁剪可能非常令人困惑。 CV世界在角对(X1,Y1)上运行,而python通过切割数组来运行。正确的裁剪可能如下所示:

crop = original [y1:y2,x1:x2]#关注你的Y&X&#39>