packtpub 29

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (Literacy – EAST detector와 tesseract과 이용한 text 추출 + 스크린 캡처) with Raspberry Pi

안녕하세요.    문자열 추출하는 구현은 기본적으로 끝이 났습니다. 그렇지만 성능을 조금 향상하기 위한 기능을 추가해 보도록 하겠습니다. 컴퓨터에 desktop 화면을 드래그 선택해서 캡처 이미지에서 문자를 추출하는 기능을 추가해 볼 예정입니다.이전 내용처럼 frozen_east_text_detection.pb 파일은 디버그 디렉터리에 있어야 합니다. 1. ScreenCapturer 클래스 생성   QtCreator에서 LiteracyW 프로젝트를 불러온 후 프로젝트 파일에서 오른쪽 버튼을 눌러 “Add New”를 눌러 C++ Class를 생성합니다.     - 클래스 이름을 ScreenCapturer로 하고 base class를 QWidget으로 선택해서 생성합니다. 그러면 header 파일과 Sour..

Programming/Qt 2024.06.26

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (Literacy – EAST detector와 tesseract과 이용한 text 추출) with Raspberry Pi

안녕하세요.  이전 내용에 추가해서 전체 이미지상에서 문자열을 바로 추출하는 것이 아니라, 텍스트 영역을 검색하는 detector를 추가해서 좀 더 정확한 문자열을 추출해 봅니다.  1. EAST detector 학습된 자료 다운로드   - OpenCV의 EAST(Efficient and Accurate Scene Text) text detector는 novel architecture와 training pattern을 바탕으로 하는 deep learning model입니다. 그래서 학습을 시키는 과정이 필요한데, 여기서는 미리 학습한 데이터를 이용하는 것으로 합니다.   - 이전 내용 LiteracyW_day3에 폴더에 학습된 데이터를 다운로드합니다. (이 글에서는 day4로 새로 디렉터리를 생성해서 하..

Programming/Qt 2024.06.14

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (Literacy – tesseract 이용한 text 추출) with Raspberry Pi

안녕하세요.   아쉽게도 바로 이전 내용에서 윈도용으로 진행했었는데, 윈도우상에서 Qt와 tesseract, OpenCV 조합하기가 어려워져서  라즈베리 파이로 환경을 바꿨습니다. 이후 내용은 리눅스 기반에서 작업하는 것으로 생각하시면 됩니다.   이전 Rasbperry Pi 내용에서 Tesseract 4.1.3을 Raspberry Pi CM4에 설치했다는 것을 전제로 아래 내용을 진행합니다. (하단 링크 참고) 추가로, 현재 최신 버전인 Tesseract 5.1.x를 설치해보려고 했으나 현재 라즈베리 파이 상에서는 설치가 되지 않았습니다. (다른 OS에서는 테스트해보지 않았습니다.)  Raspberry pi CM4(Bullseye)에서 Tesseract 4.1.3 설치 및 OCR 테스트안녕하세요.   ..

Programming/Qt 2024.06.04

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (Literacy(OCR) – UI 구성)

안녕하세요.   이번 주제를 이미지에서 글자를 추출하는 프로젝트입니다.  많이 알고 있는 광학 문자 인식(Optical character recognition; OCR)입니다. 오픈된 라이브러리를 사용해서 인식하고, 또한 위치도 파악해서 표시도 해보는 내용입니다.  1. OCR의 역사   OCR의 역사는 1928년에 독일의 G. Taushek가 미리 준비된 몇 개의 표준 pattern문자와 입력문자를 비교하여 표준 pattern문자와 가장 유사한 것을 해당 문자로 선정하는 pattern matching기법을 이용한 문자 인식 방법을 특허로 등록하면서 시작되었다. 연구소나 기업 등에서 대형 컴퓨터를 통하여 수행되던 것이 PC와 이미지 스캐너의 보급으로 우리 가까이 사용되기 시작한 것은 이미 20년이 넘었다..

Programming/Qt 2024.05.23

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (얼굴 랜드마크 최종 결과물 – 안경, 콧수염, 쥐 코)

안녕하세요.    이전 내용을 총정리하는 단계로 얼굴 특징점을 찾아 안경과 콧수염, 쥐 코를 선택하여 실시간 영상에 반영할 수 있도록 합니다. 선택하는 것은 체크박스를 생성하여 선택할 수 있도록 합니다. 이전 파일에 오타 등이 있기 때문에 이번 첨부된 소스를 참고하시면 됩니다.   1. 소스파일 수정 1) capture_thread.h   - 어떤 특징점에 어떤 것을 표시할지 열거형의 타입을 생성합니다. 여기서 MASK_COUNT는 기능을 나타내는 것이 아니라 열거형의 개수를 확인하기 위한 마지막 카운트 값으로 사용  - 체크상태를 업데이트할 수 있는 함수를 선언  - 어떤 체크박스인지, 기능을 설정할지 여부를 인자로 가지는 함수를 선언  - 체크박스의 각 상태를 비트 값으로 저장하는 형태로 하기 위해서..

Programming/Qt 2024.05.21

[도서 실습]얼굴 랜드마크(눈)에 안경 그리기)

안녕하세요.   이전 내용에서 얼굴과 얼굴의 특징점(눈, 코, 입 등)을 비디오상에서 감지하는 코드를 작성하였습니다. 이 특징점에 장신구(Ornaments)를 적용(그리는 것)시키는 것을 해보겠습니다. 이 책에서 제공해 주는 장신구는 안경과 콧수염, 쥐의 수염 이미지를 제공해주고 있습니다.   이 이미지를 그냥 불러서 사용해도 되겠지만, Qt에서 관리적인 차원에서 사용하려면 리소스 파일을 만들어서 사용할 수 있습니다. 그래서 코딩하기 전에 간단한 리소스 파일을 만들어야 합니다. 그리고 리소스 파일을 불러와서 특징점 좌표에 회전된 값을 구하여 그려주는 작업을 하면 됩니다. 1. 리소스 파일 만들기   1.1 image.qrc 파일 만들기    - 우선 FacetiousW 소스가 들어 있는 폴더에 Image..

Programming/Qt 2024.05.16

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (얼굴 랜드마크(특정부위-눈, 코 등) 감지하기)

안녕하세요.  이전 내용에서 얼굴을 감지하는 것을 해보았습니다. 그리고 얼굴의 특징점을 찾기 위해서 OpenCV의 contrib 라이브러리 소스를 컴파일하고 라이브러리 파일을 만들어 보았습니다. 이번에는 그중에 face 라이브러리를 사용해서 얼굴에 있는 눈, 눈썹, 코, 입을 감지해 보도록 하겠습니다. 1. 라이브러리 확인   이번에 사용할 libopencv_face 라이브러리를 이용할 것입니다. 참고로 이 라이브러리에 어떤 함수들이 확인해 볼 수 있는 링크를 걸어 두었습니다.https://docs.opencv.org/4.5.3/d4/d48/namespacecv_1_1face.html   얼굴의 특징을 잡아낼 수 있는 FacemarkKazemi, FacemarkAAM과 FacemarkLBF classes..

Programming/Qt 2024.05.10

[도서 실습] Qt 5 and OpenCV 4 Computer Vision (OpenCV-contrib windows 버전 설치하기)

안녕하세요.   Facetious 내용 중 OpenCV-contrib 모듈에 있는 기능을 사용하기 위해서 우선 OpenCV-contrib 버전을 설치해야 합니다. 처음 OpenCV 설치할 때 같이 설치했으면 좋지 않았을까 하지만, 지금 내용이 나오기 때문에 어떻게 추가 설치하는지 확인해 보도록 하겠습니다.  단, 이전 내용에서 Windows용 OpenCV를 64bit용 Mingw32 컴파일해서 OpenCV 라이브러리를 사용하고 있다는 전제에서 아래 내용을 진행하시면 됩니다. 만약 OpenCV 설치하는 과정이 필요하다면 아래 링크를 참조하시면 됩니다. 그리고 Windows용으로 OpenCV를 설치할 때 윈도용으로 압축된 프로그램을 실행하시는 것을 추천드립니다. (https://sourceforge.net/..

Programming/Qt 2024.05.07

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The Facetious Application 02 (얼굴인식)

안녕하세요.   이전 내용에서 얼굴을 찾아내는 프로그램을 위한 준비를 했다면 이번에는 얼굴을 찾아내는 코드를 추가해 봅니다. 이제 OpenCV 라이브러리를 이용해서 실시간으로 얼굴을 찾아는 것을 해볼 것입니다.   얼굴을 인식을 위해서 OpenCV에서 제공해 주는 cascade classifiers 기술을 사용합니다. 이것은 얼굴인식뿐만 아니라 물체를 인식할 때도 사용되는 것입니다. 우선 cascade classifier를 사용하기 전에 얼굴에 대한 학습을 진행해야 합니다. 어떤 것이 좋은 얼굴 사진이고 나쁜 사진인지 많은 데이터를 학습시켜 주어야 합니다. 학습시키는 과정도 복잡하기 때문에 여기서는 빼고 이미 만들어진 학습 데이터를 가지고 테스트해 볼 예정입니다.  1. 정면 얼굴 학습 데이터 준비   ..

Programming/Qt 2024.05.03

[도서 실습] Qt 5 and OpenCV 4 Computer Vision - The Facetious Application 01 (사진 찍기)

안녕하세요.  이번에 챕터에서 진행되는 내용은 실시간으로 얼굴을 인식해서 마스크를 씌우는 프로그램을 만드는 것으로 진행됩니다. 프로그램의 기본 형틀은 앞에서 만든 GazerW를 기반으로 해서 레코딩과 모션 감지 부분을 제거하고 얼굴 인식하는 기능을 넣어서 작동하게 하는 것입니다.  1. 프로그램 틀 만들기 1) 폴더 내 수정   - GazerW 마지막 버전의 프로젝트 폴더를 복사해서 Facetious로 변경합니다. 이 글에서는 첫 번째 하는 것이라. Facetious_day1로 변경하였습니다.   - GazerW.pro 파일을 FacetiousW.pro로 변경합니다. 책 내용에서는 여러 가지를 내용을 수정해주어야 하지만, 폴더와 pro 파일에서는 현재 Windows 버전의 Qt에서는 크게 진행할 내용이 ..

Programming/Qt 2024.04.28

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The GazerW Application (Motion detection, 움직임 감지)

안녕하세요. 프레임 저장 기능까지 했다면 이제는 영상에서 움직임이 발생하면 감지하고 감지되었을 때 녹화까지 하는 기능을 추가해 보겠습니다. 여기서 감지는 OpenCV에서 제공해 주는 함수로 진행할 예정입니다. 1. 구현 방법 보통 모션 감지는 background와 foreground 이미지를 segmentation(영상 분할) 해서 사용합니다. 그렇기 때문에 우리가 예측할 수 있는 것은 카메라의 background 이미지는 정적일 것이고, 프레임의 변화가 없을 것입니다. 그리고, 연속적인 foreground 프레임을 추출하고 그 속에서 물체들을 찾아내는 방식을 이용합니다. 그러나 이러한 추측은 현실에는 힘들 수 있습니다. 왜냐하면 태양이 뜨고, 지고, 그림자가 나타나는 부분도 감지가 되기 때문입니다. 상..

Programming/Qt 2024.04.24

[도서 실습] Qt5 and OpenCV4 Computer Vision – The GazerW Application (영상 녹화하기, 썸네일)

안녕하세요. 이전 내용은 카메라에 접근하고 정보를 얻고 실제 영상을 재생방법에 대해 알아보았습니다. 이번에는 영상을 어떻게 녹화하는지 확인해 보겠습니다. 단순한 방법으로는 카메라로부터 영상을 캡처하는 동안, 매 프레임을 압축해서 영상파일에 기록하는 것입니다. OpenCV에 포함된 videoio module의 VideoWriter Class에서 이런 간단한 기능을 제공합니다. 1. Utilities Class 파일 생성 파일 저장 경로와 이름을 자동으로 생성될 수 있게 클래스 하나를 만듭니다. 실제 코드 부분만 공유하였고, 해더 파일이나 중복된 부분은 생략했습니다. 부족한 부분은 첨부한 파일을 확인하면 됩니다. - 함수선언을 보면 폴더 경로를 가져오고, 파일 이름 생성하고, 파일 이름에 확장자를 붙여 절대..

Programming/Qt 2024.04.21

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The GazerW Application (FPS 계산하기)

안녕하세요. FPS라고 하면 게임에서 많이 볼 단어이지만 영상에 처리 많이 사용하는 용어이기도 합니다. 그래서 간단하게 정의를 찾아보고 테스트해 보겠습니다. 1. FPS란 동영상을 물리적으로 환원하면 시간상 연속된 정지 사진들의 모음으로 볼 수 있는데, 이 각각의 정지 사진 하나를 '프레임'이라 부른다. 이런 사진 토막들이 1초에 몇 장 보이느냐, 즉 프레임이 보이는 속도를 가리켜 'Frame Rate', 우리말로 옮기면 프레임률이라 하며, 단위로는 'fps' 혹은 국제 표준인 'Hz'를 쓴다. 간혹 모니터 주사율(refresh rate)과 헷갈리는 일이 있는데, 이는 단위가 같지만 완전히 별개의 개념이다. 모니터 주사율의 단위는 'Hz'로 표기하고, '화면 재생 빈도'라고 하며 모니터가 그래픽 카드에서..

Programming/Qt 2024.04.19

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The GazerW Application (Thread를 이용한 카메라 영상 출력)

안녕하세요. 이번 내용은 Thread를 이용해서 카메라 영상을 GUI 멈춤 현상 없이 출력하는 것입니다. 단순하게 OpenCV 기능으로 카메라 객체를 불러와서 ESC 키를 누르기 전까지 프레임을 화면에 재생하는 기능을 만들 수도 있습니다. 그러나 그렇게 하면 단순기능은 되지만, GUI 화면이 멈추는(freeze) 현상이 발생합니다. 그래서 GUI가 실행하는 Thread에 재생과 녹화를 소스를 포함하는 것이 아니라, 별도의 스레드(Thread)를 만들어 재생, 녹화하는 것을 동작하게 하는 것입니다. 1. 클래스 생성 - 기존의 GazerW_Day2 소스에서 추가해서 작업을 진행합니다. - GazerW 프로젝트에서 오른쪽 마우스를 클릭해서 "Add New..." 그리고 class 추가를 눌러서 Capture..

Programming/Qt 2024.04.11

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The GazerW Application (카메라 정보 얻어오기)

안녕하세요. 이제 UI가 만들어졌다면 간단하게 컴퓨터에 장착되어 있는 카메라 정보를 가져오도록 기능을 추가해 보겠습니다. 1. 구현할 내용 Qt library에 포함되어 있는 QCameraInfo 클래스를 사용해서 현재 컴퓨터에 사용 가능한 카메라의 정보를 확인하는 것입니다. 2. 기능 구현 메뉴의 "Camera Information" 기능을 실행되게 하려면 slot를 만들어 연결시켜 주고 구현도 해주어야 합니다. 1) mainwindow.h 추가 내용 필요한 라이브러리 헤더 파일과 private slots 영역을 만들어 함수를 선언합니다. #include #include ... private slots: void showCameraInfo(); 2) GazerW.pro 추가 내용 #include 만 추..

Programming/Qt 2024.04.04

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The Gazer Application 1편 - 화면 생성(완성된 소스 확인)

안녕하세요. Gazer Application을 만들어 보기 전에 기능과 화면 구성에 대해서 이전 내용에서 확인해 보았습니다. 이제는 실제 Qt로 개발하는 것을 진행해 보겠습니다. 우선 이전 내용에서 말한 것처럼 기존 소스가 잘 작동하는 것인지 확인하고 시작하겠습니다. 1. 원본 소스 프로그램 실행 - 몇 가지 내용 수정하고 소스를 컴파일해서 실행 시면 문제없이 카메라 영상을 볼 수 있습니다. 그리고 모션 변화가 있을 때도 감지되는 것을 확인할 수 있습니다. 그래서 책 내용처럼 추가해서 만들어 보도록 하겠습니다. 그러나 원본 소스를 실행하려면 몇 가지 수정 후 실행해야 합니다. 1) 수정해야 할 부분 - 첫 번째로 Gazer.pro 파일에 OpenCV 경로를 지정해 주고 필요한 라이브러리도 함께 입력해주어..

Programming/Qt 2024.03.30

[도서실습] Qt 5 and OpenCV 4 Computer Vision – The Gazer Application 시작 준비하기(영상 프로그램 UI 및 기능)

안녕하세요. 이번 장(Chapter)에서는 이전 ImageEditor 프로그램을 끝내고, 이제 실제 영상에 관련된 프로그램 예제에 들어가게 됩니다. Gazer의 의미는 응시자라고 합니다. 우선, 책의 Gazer Application에서 어떤 내용을 다루고 있는지 확인해 보겠습니다. - Open a webcam and play the video that's been captured from it in real time - Record video from the webcam by clicking on a start/stop button - Show a list of saved videos - Detect motion, save video, and send notifications to our mobile p..

Programming/Qt 2024.03.19

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – ImageEditor (Plugin Mechanism – Affine)

안녕하세요. 이미지 에디터 마지막 내용으로 Affine 함수를 사용해보려고 합니다. 이전에 이미지를 회전해 보았다면, 이제는 이지를 약간 틀어져 보이게 해 보겠습니다. 표현이 맞을지 모르겠으나, 평면의 이미지를 약간 입체적으로 보이는 느낌으로 만든다라고 할까요. ^^ 1. 소스 코드 시작 전 1) 아핀 변환(Affine Transformation) 선형 변환에 이동 변환까지 포함된 변환입니다. 선의 수평성을 유지하며, 변환 전의 서로 평행한 선은 변환 후에도 평행함을 의미합니다. 즉, 길이의 비와 평행성이 보존되는 변환입니다. 사각형을 평행사변형으로 변환하는 것을 아핀 변환으로 간주합니다. 아핀 변환은 점 사이의 거리 비율뿐만 아니라 선의 수평성을 유지하는 모든 변환입니다. (예: 선의 중간점이 변환 후..

Programming/Qt 2024.03.13

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – ImageEditor (Plugin Mechanism – Rotating Images)

안녕하세요. 이번에는 이미지를 회전시키는 플러그인을 추가해 보도록 하겠습니다. 간편하게 rotate() 함수를 호출해서는 되지 않고 몇 가지 개념을 가지고 회전을 시켜야 했습니다. 1. 소스 코드 시작 전 1) 기하학적 변형(Geometric transformations) - 책 내용처럼 쉽게 생각해서 이미지만 회전시키면 되겠지 생각할 수 있지만, 조금 자료를 찾아보면 기하학이라는 좌표 개념과 수학적 지식이 필요했습니다. 간단하게 정의를 살펴보면, "영상의 기하학적 변형이란 화소의 위치를 변화하여 원 영상과는 다른 내용을 갖는 것을 말한다. 이러한 기하학적 변형에는 좌우 교환, 상하 교환, 평행 이동, 확대 및 축소, 회전 변형 등이 있다. 기하학적인 변형을 수학적으로 표현하기 위하여 변형되기 전의 화소..

Programming/Qt 2024.03.08

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – ImageEditor (Plugin Mechanism – Cartoon)

안녕하세요. 이번에는 이미지를 만화처럼 보이게 하는 효과를 플러그인 기능으로 만들어 보도록 하겠습니다. 프로젝트 만드는 방법은 이전 Sharpen 내용과 동일하기 때문에 필요하다면 이전 내용을 참조하시면 됩니다. 그럼 새로운 라이브러리 프로젝트를 생성한 후 진행하시면 됩니다. 1. 소스 코드 시작 전 - 프로젝트명을 Cartoon_plugin으로 하고 클래스 이름은 CartoonPlugin으로 만드시면 됩니다. 그리고 CartoonPlugin::name() 함수와 CartoonPlugin::edit() 함수를 선언하고 정의하면 됩니다. - 우선 첫 번째 작업은 색상 팔레트를 축소시키는 것입니다. 그렇게 하기 위해서는 OpenCV 라이브러리에서 제공하는 bilateral filter를 사용합니다. 필터는 ..

Programming/Qt 2024.03.02