2013-06-05 41 views
0

我對OpenCV比較陌生。我從教程收集等,你可以使用這個腳本裁剪:Python 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

什麼是[(X1,Y1)的值,(x2,y2 )? – Bull

+0

我的代碼是: 'def onmouse(self,event,x,y,flags,param): self.onwindow = 1#鼠標在屏幕上 x,y = np.int16([x ,y])#BUG self.currentxy =(x,y) if event == cv2.EVENT_LBUTTONDOWN: self.RectOn = 0 #Del old rectangle and make new one self.click = 1 self。self.selection [1] =(0,0) if event == cv2.EVENT_LBUTTONUP: self.click = 0 self.x2y2 =(x,y) =(X,Y) self.selection [1] = self.x2y2 self.RectOn = 1 打印self.selection' –

回答

2

vis只是一個numpy數組。
檢查print vis.shape的結果以檢查輸入圖像的尺寸。
在彩色圖像的情況下,這將是這樣的:

(367, 550, 3) 

它代表的heightwidth然後color depth訂單的尺寸。
所以,如果你想選擇(X1,Y1)的部分(x2,y2)時X2> X1和Y2> Y1:

vis[y1:y2, x1:x2] 

,這也將覆蓋深度尺寸太大。
請注意,如果y2<y1x2<x1,結果將是一個空數組。

+0

謝謝!它正在工作,我有'[y1:y2,x1:x2]'相反的方式。而你的權利,我必須做一些關於在不同位置被選中的兩點。謝謝! –

+0

不客氣。 –

1

你需要使用

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

看到this answer得到一個詳細的解釋。

還檢查相機是否實際輸出任何東西。行後

ret, vis = self.cam.read() 

添加這些行

if not ret: 
print 'No captured images' 
0

Croping可以非常混亂。 CV世界在角對(X1,Y1)上運行,而python通過切片數組來工作。正確的種植可能看起來像:

作物=原[Y1:Y2,X1:X2]#注意你個Y和X的