2016-05-03 8 views
1

画像からチェス盤を抽出しようとしています。それは私が削除したい他の不要なコンテンツがたくさんあります。だから私はすべての斜面を持つマスクを作った。その後、オリジナルのグレースケール画像を持つbitwise_andです。私は初心者ですが、これはOpenCVが非常に面白いと思っていますが、私はこの問題に悩まされています。助けてください!マスクで画像をbitwise_してみると、PythonでOpenCVエラーが発生する

import cv2 
import numpy as np 
from PIL import Image 


kernel = np.ones((5,5),np.uint8) 
img = cv2.imread('test1.jpg',0) 
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) 

ret,thresh1 = cv2.threshold(img,60,255,cv2.THRESH_BINARY) 
edges = cv2.Canny(thresh1,100,200) 

cv2.imwrite("canny.jpg", edges) 
minL = 10000 
maxL = 8 
lines = cv2.HoughLinesP(edges,1,np.pi/180, 85)#, minL, maxL) 


mask_l = np.zeros(img.shape[:2]) 
mask_r = np.zeros(img.shape[:2]) 
mask_t = np.zeros(img.shape[:2]) 
mask_b = np.zeros(img.shape[:2]) 


width, height = lines.shape[:2] 

im_x, im_y = img.shape 


for x1,y1,x2,y2 in lines[0]: 
    cv2.line(edges,(x1,y1),(x2,y2),(255,255,255),2) 
    if (x2-x1) == 0: 
     continue 
    else: 
    m = (y2 - y1)/(x2 - x1) 
    if(m > 0): 
     for im_count in range(im_x): 
      yp = round(m * (im_count - x1)) + y1 
      if yp >= 1 and yp <= im_y: 
       for temp1 in range(int(im_count),int(im_x)): 
        mask_r[int(yp)][int(temp1)] = 1 
       for temp2 in range(int(im_count)): 
        mask_l[int(yp)][int(temp2)] = 1 
    else: 
     for im_count in range(im_x): 
      yp = round(m * (im_count - x1)) + y1 
      if yp >= 1 and yp <= im_y: 
       for temp1 in range(int(yp), int(im_y)): 
        mask_b[int(im_count)][int(temp1)] = 1 
       for temp2 in range(int(yp)): 
        mask_t[int(im_count)][int(temp2)] = 1 

cv2.imwrite('new.jpg', edges) 


temp_mask1 = cv2.bitwise_and(mask_l, mask_r, mask=None) 
temp_mask2 = cv2.bitwise_and(mask_t, mask_b, mask=None) 
final_mask = cv2.bitwise_and(temp_mask1, temp_mask2) 




final_mask = cv2.morphologyEx((final_mask * 1.0).astype(np.float32), cv2.MORPH_CLOSE, kernel=None) 

cv2.imshow('final',final_mask) 
cv2.waitKey(0) 


cv2.destroyAllWindows() 

x,y = img.shape 
print x 
print y 
ret, orig_mask = cv2.threshold(final_mask, 10, 255, cv2.THRESH_BINARY) 
a,b = final_mask.shape 
print a 
print b 


imeg = cv2.imread('test1.jpg',cv2.CV_LOAD_IMAGE_GRAYSCALE) 

ret, orig_mask1 = cv2.threshold(imeg, 10, 255, cv2.THRESH_BINARY) 
(thresh, im_bw) = cv2.threshold(imeg, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
images1 = cv2.bitwise_and(img,img, mask=orig_mask) 
cv2.imwrite("123.jpg",images1) 

これは私が取得していますエラーです:

OpenCV Error: Assertion failed ((mask.type() == CV_8UC1 || mask.type() == CV_8SC1)) in binary_op, file /build/buildd/opencv-2.3.1/modules/core/src/arithm.cpp, line 1033 

マスクとイメージの両方の寸法は同じです。しかし、私はまだこのエラーが発生します!

+1

これは既にここで答えられているようです:http://stackoverflow.com/questions/29153569/opencv-with-python-error-assertion-failed-mask-type-cv-8uc1-mask-typ –

+0

私は試しましたその投稿で提案されたことをやっているが、それでもエラーは続く – Raghuveer

答えて

0

maskは、符号付きまたは符号なしの8ビット整数で構成する必要があります。これは、CV_8SC1CV_8C1の意味です。

符号付きバージョンのマスクをnp.zeros(shape, dtype=np.uint8)またはnp.int8として作成してください。

また、マスクに割り当てられた計算が適切な8ビット範囲:0-255に収まることを確認します。

関連する問題