라벨이 opencv-python인 게시물 표시

[opencv-python] cv2.rectangle() TypeError: an integer is required (got type tuple)

이미지
cv2.rectangle() TypeError: an integer is required (got type tuple) 'tuple에 integer형이 필요 '하다는 에러입니다. cv2.rectangle() parameter를 보면 start_point와 end_point는 tuple type으로 두 개의 좌표 값을 가져야 한다고 나옵니다. 이때 start와 end_point는 모두 int형의 값을 취해야 합니다. Example 1 import cv2 img = cv2.imread( "image/cat.jpg" ) rect_img = cv2.rectangle(img , ( 0 , 0 ) , ( 100.1 , 100 ) , ( 0 , 0 , 255 ) , - 1 ) cv2.imshow( "rect" , rect_img) cv2.waitKey() # 출력 (에러) # Traceback (most recent call last): #   File "D:/python_projects/mine/blog/retacgle_error.py", line 5, in <module> #    rect_img = cv2.rectangle(img, (0, 0), ( 100.1 , 100), (0, 0, 255), -1) # TypeError: an integer is required (got type tuple) start_point에서 int를 취하지 않아 에러가 발생했습니다. Example 2 import cv2 img = cv2.imread( "image/cat.jpg" ) rect_img = cv2.rectangle(img , ( 0 , 0 ) , ( 100 , 100 ) , ( 0 , 0 , 255 ) , - 1 ) cv2.imshow( "rect" , r

[opencv-python] np vstack, hstack을 이용한 이미지 이어 붙이기

이미지
이미지 이어 붙이기 1. vstack vstack은 vertical stack으로 수평을 기준으로 배열을 쌓는다고 생각하면 됩니다. 즉, 열의 수가 같은 두 개 이상의 배열을 위에서 아래로 연결합니다. vstack을 수행하기 위해서는 prameter인 tup에 쌓고자 하는 두 개 이상의 배열을 넣으면 되는데, 반드시 두 번째 shape이 동일 해야 합니다. 두 번째 shape이 동일해야 하는 이유는  배열을 수평으로 쌓으려면 열이 같아야 하기 때문입니다 . import numpy as np arr1 = np.array([[ 1 , 1 , 1 ]]) arr2 = np.array([[ 3 , 3 , 3 ]]) arr3 = np.array([[ 6 , 6 , 6 ] , [ 6 , 6 , 6 ]]) print ( "{0}, arr1.shape = {1}" .format(arr1 , arr1.shape)) print ( "{0}, arr2.shape = {1}" .format(arr2 , arr2.shape)) print ( "{0}, arr3.shape = {1}" .format(arr3 , arr3.shape)) vstack_arr1 = np.vstack((arr1 , arr2)) print ( "{0}, vstack_arr1.shape = {1}" .format(vstack_arr1 , vstack_arr1.shape)) vstack_arr2 = np.vstack((arr1 , arr2 , arr3)) print ( "{0}, vstack_arr2.shape = {1}" .format(vstack_arr2 , vstack_arr2.shape)) # 출력 # [[1 1 1]], arr1.shape = (1, 3) # [[3 3 3]], arr2.shape = (1, 3) #

[opencv-python] error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

이미지
!_src.empty() in function 'cv::cvtColor' 해결법 imread는 이미지를 제대로 읽어오지 못할 경우 None을 반환합니다. [1] 1. File Path 확인 [2] 아래와 같은 에러가 발생하는 원인은 이미지를 제대로 불러오지 못했기 때문 입니다. import cv2 img_path = "D:/Animal Picture/cat.jpg"   img = cv2.imread(img_path , cv2.IMREAD_COLOR) cv2.imshow( "src" , cv2.cvtColor(img , cv2.COLOR_BGR2GRAY)) cv2.waitKey() # 출력 # error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' cv2.imread 과정에서 이미지를 제대로 읽어왔는지 확인해보면 아래와 같이  None값 을 가져옵니다. print (img) # 출력 # None img None인 경우에는 대부분의 경우 File Path를 잘못 지정 했기 때문입니다. 내가 읽고자 하는 파일의 경로를 제대로 입력했는지 확인해보시기 바랍니다. File Path: Animal Picture -> Animal Pictures 수정 import cv2 img_path = "D:/Animal Pictures/cat.jpg" img = cv2.imread(img_path , cv2.IMREAD_COLOR) cv2.imshow( "src" ,  cv2.cvtColor(img ,  cv2.COLOR_BGR2GRAY)) cv2.waitKey() # 출력 # 흑백 고양이 이미지 사진 2. 한글 File Path 사용 아래와 같이 제대로 된 File Path를

[opencv-python] 이미지 연산하는 법

이미지
Image Addition 이미지 연산으로 OpenCV에 add()와 numpy 연산으로 이미지를 더할 수 있습니다. 두 이미지를 연산하기 위해서는  반드시 "채널"과 "데이터 타입" 이 같아야하며 이미지에 scalar 값을 더할 수 있습니다. OpenCV와 numpy 연산의 차이점은 OpenCV의 cv2.add()는 Saturation 연산 , numpy는 modulo 연산 을 합니다. Saturation 연산 Saturation은 임계값을 정해 그 값을 벗어나는 경우 특정 값으로 계산하는 방식 입니다. 이미지에서는 add 연산으로 픽셀 값이 255(임계값) 이상인 값들은 255로 0(임계값) 이하인 값들은 0으로 표현하는 연산입니다. import numpy as np mat0 = np.uint8([[ 130 , 140 ] , [ 150 , 160 ]]) mat1 = np.uint8([[ 100 , 100 ] , [ 150 , 150 ]]) mat0_add_mat1 = cv2.add(mat0, mat1) print ( "mat0 \n {0} \n " .format(mat0)) print ( "mat1 \n {0} \n " .format(mat1)) print ( "add(mat0, mat1) \n {0}" .format(mat0_add_mat1)) # 출력 # mat0 # [[130 140] #  [150 160]] # mat1 # [[100 100] #  [150 150]] # add(mat0, mat1) # [[230 240] #  [255 255]] mat0 + mat1 과정에서 (150 + 150), (160 + 150) = 300, 310이 각각 나와야하지만 Saturation 연산을 통해 255가 넘은 값들을 모두 255로 변경 하였음

[opencv-python] ROI를 이용한 이미지 합성

이미지
ROI를 이용한 이미지 합성 logo 이미지를 background 이미지 정중앙에 합성하는 예제를 알아보겠습니다. 2개의 이미지 불러오기 import cv2 background = cv2.imread( "image/bit_test.jpg" ) logo = cv2.imread( "image/logo.jpg" ) cv2.imshow( "background" , background) cv2.imshow( "logo" , logo) cv2.waitKey() ROI 영역 설정에 사용할 mask 생성 gray_logo = cv2.cvtColor(logo , cv2.COLOR_BGR2GRAY) _ , mask_inv = cv2.threshold(gray_logo , 10 , 255 , cv2.THRESH_BINARY_INV) cv2.imshow( "mask_inv" , mask_inv) cv2.waitKey() cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY) Notes Color-space를 변환하는 함수. cv2.COLOR_BGR2GRAY를 통해 컬러인 logo 이미지를 gray 이미지로 변환합니다. BGR to GRAY cv2.threshold(gray_logo, 10, 255, cv2.THRESH_BINARY_INV) Notes 임계값(thresh)를 넘으면 임계값을 넘었을 때 적용할 value(maxval)로 값을 변경하는 함수. cv2.THRESH_BINARY_INV를 통해 이미지를 이진화 합니다. (흑(0)과 백(255)으로 분리) # binary image INV(inverse)가 사용되었음으로 분리된 흑과 백을 반대로 변경 합니다 (흑->백, 백->흑) # binary_inverse image cv

[opencv-python] 이미지 크기조절(resize) 하는 법

이미지
이미지 크기 조절(resize) 이미지 크기를 조절하는 예제를 알아보겠습니다. 이미지 불러오기 import cv2 img = cv2.imread( "image/cat.jpg" ) cv2.imshow( "img" , img) cv2.waitKey() cat.jpg 이미지를 불러와 화면에 띄웁니다. 이미지 크기 조절 img = cv2.imread( "image/cat.jpg" ) print ( "img.shape = {0}" .format(img.shape)) resize_img = cv2.resize(img , ( 300 , 300 )) print ( "resize_img.shape = {0}" .format(resize_img.shape)) cv2.imshow( "img" ,  img) cv2.imshow( "resize img" , resize_img) cv2.waitKey() # 출력 # img.shape = (360, 480, 3) # resize_img.shape = (300, 300, 3) 이미지 크기 조절 방법 1 - cv2.resize(img, dsize=(300, 300)) cv2.resize(원본 이미지, 결과 크기 이미지)로 이미지의 크기를 조절할 수 있습니다. 결과 크기 이미지는 Tuple이며 (width, height)의 형식 입니다. 이미지 크기 조절 방법 2 - cv2.resize(img, dsize=(300, 300), interpolation=cv2.INTER_AREA) cv2.resize(원본 이미지, 결과 크기 이미지, 보간법)로 이미지 크기를 조절할 수 있습니다. 보간법은 이미지의 크기를 변경하면 변경된 이미지의 픽셀 사이의 값을 결정해야 하는데, 이때 보간법을 사용합니다.