0

我对 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 语句之后,打印裁剪返回“[]”和空列表。

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

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

4

3 回答 3

4

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

(367, 550, 3)

它表示按顺序排列的尺寸heightwidth然后是color depth
因此,如果您想在 x2>x1 和 y2>y1 时选择 (x1,y1) 到 (x2,y2) 的一部分:

vis[y1:y2, x1:x2]

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

于 2013-06-05T16:40:37.207 回答
1

你需要使用

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

请参阅此答案以获取详细说明。

还要检查相机是否真的输出了任何东西。行后

ret, vis = self.cam.read()

添加这些行

if not ret:
 print 'No captured images'
于 2013-06-05T23:38:28.317 回答
0

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

crop = original[y1:y2, x1:x2] # 注意你的 Y 和 X

于 2014-07-20T01:14:21.180 回答