728x90

코딩/python + 컴퓨터비전 38

[python, opencv] 웹캠 영상 출력하는 방법

안녕하세요. 비스카이비전입니다. 파이썬에서 이미지 또는 비디오를 소스로 삼아 작업을 해야하는 경우에는 opencv 라이브러리를 주로 사용합니다. 오늘은 웹캠 영상으로 작업시 필요한 기본 코드에 대해서 정리해보고자 합니다. 이 기본 코드를 베이스로 삼아 원하시는 기능을 적재적소에 추가하시면 됩니다. 일단 웹캠이 내장되어 있는 노트북 또는 별도의 웹캠을 연결한 데스크탑을 준비해주세요. 그리고 opencv 패키지를 설치하지 않으신 분들은 설치해주세요. pip install opencv-python 웹캠 영상 출력하기 우선 전체 코드를 올려놓고 설명드리겠습니다. import cv2 webcam = cv2.VideoCapture(0) if not webcam.isOpened(): print("Could not o..

[python] pytesseract 사용중 print 안 되는 애러 해결법

tesseract는 유명한 광학문자인식(optical character recognition, OCR) 툴입니다. OCR은 어떤 문서를 스캔했을 때 그 안의 문자들을 인식하는 용도 등에 많이 사용됩니다. pytesseract는 파이썬에서 tesseract를 사용할 수 있도록 도와주는 라이브러리입니다. 저는 파이썬에서 tesseract를 이용해서 인식한 글자들을 print() 함수를 이용해서 콘솔에 띄우려고 했는데 아무 것도 보이지 않더라고요. 인식이 안 된 건가 싶어서 메모장에 저장해봤더니 글자들이 저장되어 있었습니다. 인식이 되었다는 뜻이죠. 이게 무슨 일인가(이게 머선129) 싶어서 찾아봤더니 역시 stackoverflow에 좋은 정보가 있었습니다. stackoverflow.com/questions/..

[python] cv2 이미지를 pillow 이미지로 변경하기, Image.fromarray()

저는 영상처리 및 컴퓨터비전 관련 과제를 수행할 때 opencv와 pillow를 자주 사용하곤 합니다. 그러다보니 이미지를 opencv (cv2)에 맞게 변환시켜야 할 때가 있고, pillow에 맞게 변환시켜야 할 때도 있습니다. 변환 과정 없이 그냥 사용하면 에러가 납니다. 서로 규격이 안 맞는 것이죠. 오늘은 cv2.imread()로 읽은 이미지를 pillow 이미지로 변환하는 것에 대해 살펴보도록 하겠습니다. cv2로 읽은 이미지는 넘파이 배열에 담겨집니다. 이것을 pillow 이미지로 변환하려면 pillow (PIL) 패키지의 Image.fromarray() 함수가 필요합니다. 1 2 3 4 5 6 7 8 9 10 11 import cv2 from PIL import Image cv2_img = ..

[python+openpose] openpose 라이브러리를 사용해서 관절 포인트 검출하기 (window 10 환경)

오늘은 openpose 라이브러리를 이용해서 관절 포인트들을 검출해보겠습니다. 한 장의 이미지를 이미 훈련된 pose estimation 모델에 넣어줘서 key point(관절 포인트)들이 검출된 결과를 얻어볼 것입니다. 우선 CMU-Perceptual-Computing-Lab의 깃헙에서 openpose를 다운로드 받습니다. github.com/CMU-Perceptual-Computing-Lab/openpose 별의 갯수와 fork의 숫자를 보니 정말 많은 사람들이 사용하는 라이브러리네요. openpose 라이브러리 다운로드가 완료되었다면, 압축을 푼 후에 models 디렉토리로 이동한 후에 getModels.bat을 실행합니다. 더블클릭하면 됩니다. 그러면 다음과 같은 창이 뜨면서 이런 저런 모델들을 ..

[python] 외장 웹캠을 사용할 때 cv2.VideoCapture(1)로 했는데 안되면?

일반적으로 cv2.VideoCapture(0)은 노트북 내장 웹캠을 작동시키고, cv2.VideoCapture(1)은 노트북에 USB로 따로 연결시켜준 외장 웹캠을 작동시킵니다. 그런데 외장 웹캠을 연결했고 cv2.VideoCapture(1)로 하는데 실행이 안 되고 다음과 같은 에러가 뜰 때가 있습니다. can't open camera by index 이런 경우에는 한번 cv2.VideoCapture(2)를 시도해보세요. 저는 이렇게 해주니 되더라고요. 싱거운 결말이죠?ㅎㅎ

[ubuntu+python] 특정 사람의 얼굴만 검출하기(face_recognition+dlib+GPU)

어떤 사람의 사진을 단 한 장만 넣어주면, 동영상 내에서 그 사람의 얼굴만 검출하는 것을 만들어봤습니다. 저는 제 사진을 주고, 영상 내에서 제 얼굴만 검출되도록 예제를 만들어봤습니다. face_recognition 라이브러리와 opencv-python 라이브러리를 활용했습니다. 또한 face_recognition 라이브러리를 설치하기 전에, dlib을 GPU 연산이 되도록 설치했습니다. 특정 사람의 얼굴만 검출하는 프로그램은 아래와 같은 알고리즘으로 작동합니다. 1. 입력해 준 사진 속에서 얼굴을 검출합니다. 2. 그 얼굴에서 특성 벡터를 도출합니다. 3. 웹캠으로 촬영되는 프레임 내 얼굴을 모두 검출합니다. 4. 검출된 얼굴에서 특성 벡터를 도출합니다. 5. 검출된 얼굴의 특성 벡터와 입력해 준 사진..

[ubuntu+python] 얼굴 인식하기 (face_recognition 라이브러리 설치부터 사용까지)

face_recognition 라이브러리를 이용하면 간단한 얼굴 인식 프로그램을 만들 수 있습니다. 그런데 face_recognition 라이브러리를 설치하기 전에 먼저 준비해줘야 할 것들이 있습니다. cmake와 dlib을 먼저 설치해줘야 합니다. 1. cmake 설치 sudo apt install cmake 2. dlib 설치 git clone https://github.com/davisking/dlib.git (만약 git이 설치되어 있지 않다면 먼저 설치해주셔야 합니다.) cd dlib mkdir build cd build cmake .. cmake --build . cd .. python3 setup.py install (만약 권한 관련 에러가 발생한다면, sudo python3 setup.py..

[python] cv2.imread, cv2.imwrite 한글 경로 인식을 못하는 문제 해결 방법

cv2.imread 한글 경로 인식 문제 해결법 opencv 라이브러리의 cv2.imread 함수를 사용할 때 이미지 파일의 경로에 한글이 있는 경우에 제대로 읽어내지 못합니다. 다음 코드를 실행하면 에러가 뜹니다. 1 2 3 4 5 6 7 8 9 10 11 import cv2 path = 'D:/티스토리/티스토리 포스팅/python/cv2.imread 한글 파일 경로 인식 실패 문제 해결 방법' img_name = '교훈.jpg' full_path = path + '/' +img_name img = cv2.imread(full_path, cv2.IMREAD_COLOR) cv2.imshow('이미지', img) cv2.waitKey(0) cv2.destroyAllWindows() Colored by Co..

[python] 어떤 디렉토리 내에 존재하는 모든 이미지 파일들의 경로 리스트 만들기

어떤 디렉토리 내에 존재하는 모든 이미지 파일들을 cv2.imread 등의 방식으로 읽고 싶다면, 일단 각 이미지 파일의 경로를 알아야합니다. 저는 그것을 img_path_list라는 이름의 리스트에 하나씩 담아주도록 하겠습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os root_dir = 'C:/Users/Sim/Desktop/test' # 디렉토리 img_path_list = [] possible_img_extension = ['.jpg', '.jpeg', '.JPG', '.bmp', '.png'] # 이미지 확장자들 for (root, dirs, files) in os.walk(root_dir): if len(files) > 0: for fi..

[python] 쉽고 간단하게 마스크 착용 유무 판별기 만들기

저는 오늘 마스크 착용 유무 판별기를 만들어보려고 합니다. 객체 검출(object detection)의 방법으로 만들 수도 있겠지만, 그렇게 하면 데이터셋을 준비하는 데 꽤 큰 노력을 들여야합니다. 이미지들에서 마스크 쓴 얼굴과 마스크를 쓰지 않은 얼굴을 labelImg와 같은 라벨링 툴로 일일이 라벨링을 해줘야하기 때문입니다. 라벨링을 한다는 것은 이미지에서 마스크 쓴 얼굴과 마스크를 쓰지 얼굴을 모두 찾아서 거기에 바운딩 박스(bounding box)를 그려준 후에, 마스크를 쓰지 않은 얼굴에 0, 마스크를 쓴 얼굴에 1 이런식으로 라벨을 부여하는 것을 의미합니다. 이게 꽤 많은 시간을 들여야 하는 작업입니다. 그래서 좀 더 쉽고 간단하게 마스크 착용 유무 판별기를 만들 수 없나 고민하다가 택한 방법..