我对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返回“[]”并返回空列表。
所以是的,为什么它适用于数字和其他情况很好,但不是在这里?!
非常感谢任何帮助,谢谢!
答案 0 :(得分:2)
vis
只是一个numpy
数组
检查print vis.shape
的结果以检查输入图像的尺寸
在彩色图像的情况下,这将是这样的:
(367, 550, 3)
代表height
,width
和color depth
的维度。·
因此,如果要在x2> x1和y2> y1时选择从(x1,y1)到(x2,y2)的部分:
vis[y1:y2, x1:x2]
这也将涵盖深度维度
请注意,如果y2<y1
或x2<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>