How to fix freezing when mouse over OpenCV Mat class in Visual Studio 2017


Visual Sutio 2017 최신 버전, 그러니까 정확하게는 VS2017 15.7.x 버전에서 OpenCV 코드를 작성하다보면 마우스가 Mat 클래스 위로 올라갈 때 Visual Studio가 멈추는 현상이 발생합니다. 코드 편집이 불가능한 상태가 되어서 Visual Studio를 죽였다가 다시 실행을 해야 하는데요...


오늘 Visual Studio 2017 15.7.5 버전으로 업그레이드를 하길래 혹시나 고쳐졌나 확인해봤지만, 여전하네요. ㅎㅎ


이 현상은 Visual Studio에서 사용하는 IntelliSense 기능때문에 발생합니다. 그러므로 간단하게는 IntelliSense 기능을 끄면 Visual Studio 2017이 멈추는 현상은 발생하지 않습니다. IntelliSense 기능을 끄려면 메뉴에서 [도구] -> [옵션] / [텍스트 편집기] -> [C/C++] -> [고급] 선택 후 IntelliSense의 [자동 요약 정보]를 false로 설정하면 됩니다.


그런데 경우에 따라서는 IntelliSense 기능을 달랑 Mat 문제 때문에 끄는 것이 아쉬울 때도 있습니다. 그런 경우라면 OpenCV 소스 코드에서 Mat 클래스 주석 부분을 일부 삭제하는 방법을 사용할 수도 있습니다.


Mat 클래스는 <opencv-src>/include/opencv2/core/mat.hpp 파일에 정의되어 있습니다. 이 파일에서 Mat 클래서 정의 바로 위에 엄청나게 긴 주석이 적혀 있는데, 이 주석을 IntelliSense가 해석하다가 뻗어버리는 것으로 판단이 되네요. 그러므로 이 주석의 대부분을 과감히 삭제하면 멈추는 현상이 발생하지 않습니다. 아래 그림을 보시죠.


원래 Mat 클래스 주석이 (OpenCV 3.4.0 기준) 588라인부터 778라인까지 작성되어 있었는데요, 위 그림처럼 대부분을 지워버리는 겁니다. 그러고나서 OpenCV 소스 코드에서 Mat 클래스 위에 마우스를 올려놓으면 간략하된 Mat 주석만 풍선도움말처럼 화면에 나타납니다.


참 쉽죠? :-)






Posted by kkokkal
:


안드로이드에서 OpenCV를 이용하여 앱을 제작하는 방법을 설명하는 문서입니다.


예전에 패스트캠퍼스의 "OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프" 강의에서 진행했던 내용입니다만, 현재는 커리큘럼에서 제외한 상태이구요...


예전에 정리했던 내용을 최신 Android Studio 기준에 맞게 일부 수정하여 배포합니다.




Posted by kkokkal
:

얼마전에 Ubuntu 18.04 LTS 버전이 나왔습니다. 그래서 오늘은 Ubuntu 18.04 에서 OpenCV 최신 버전을 설치하는 방법에 대해 알아보도록 하겠습니다. 예전에 라즈베리파이에서 OpenCV를 설치하는 방법을 설명한 적이 있었는데요, 거기서 크게 다르지 않습니다.


일단 저는 Virtual Box를 이용하여 가상 머신 형태로 리눅스 우분투 18.04를 설치를 했구요, 여기에 OpenCV 3.4.0 버전을 설치하겠습니다. (참고로 CPU 코어는 2개를 할당했습니다.) 모두 5개의 Step으로 설치를 설명하고, 실제 OpenCV C++ 예제 코드를 빌드하여 실행하는 방법까지 알아보겠습니다. 각각의 Step에서 #으로 시작하는 내용은 설명을 의미하고, 실제 입력할 명령어는 $ 으로 표기하였습니다.


Step 1. 가장 먼저 리눅스를 최신 상태로 업데이트합니다.

# Optional. Ubuntu 18.04에서 libjasper-dev 패키지를 설치하기 위해서 저장소를 추가해야 합니다.
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

$ sudo apt update
$ sudo apt upgrade

# Optional. Ubuntu 18.04 설치 후 추가적으로 필요한 코덱, 미디어 라이브러리를 설치합니다.
$ sudo apt install ubuntu-restricted-extras


Step 2. 필요한 패키지를 설치합니다.

# Build tools & required
$ sudo apt install build-essential cmake git pkg-config

# For still images
$ sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev

# For videos
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt install libdc1394-22-dev libxvidcore-dev libx264-dev x264
$ sudo apt install libxine2-dev libv4l-dev v4l-utils
$ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

# GUI
$ sudo apt install libgtk-3-dev

# Optimization, Python3, etc.
$ sudo apt install libatlas-base-dev libeigen3-dev gfortran
$ sudo apt install python3-dev python3-numpy libtbb2 libtbb-dev


Step 3. OpenCV 3.4.0 소스 코드를 다운로드합니다.

# Create a working directory named opencv
$ cd ~
$ mkdir opencv
$ cd opencv

# Download sources
$ wget -O opencv-3.4.0.zip https://github.com/opencv/opencv/archive/3.4.0.zip
$ wget -O opencv_contrib-3.4.0.zip https://github.com/opencv/opencv_contrib/archive/3.4.0.zip

# Unpack
$ unzip opencv-3.4.0.zip
$ unzip opencv_contrib-3.4.0.zip


Step 4. CMake를 이용하여 Makefile을 생성합니다.

# Create a build directory
$ mkdir build && cd build

# Run CMake
$ cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_EXAMPLES=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.0/modules \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
../opencv-3.4.0/ 2>&1 | tee cmake_messages.txt


Step 5. 컴파일과 설치를 진행합니다.

# find out the number of CPU cores in your machine
$ nproc

# substitute 2 after -j by the output of nproc
$ make -j2 2>&1 | tee build_messages.txt
$ sudo make install
$ sudo ldconfig

# If the output of next command is '3.4.0' then it's ok!
$ pkg-config --modversion opencv


여기까지 설치가 잘 진행되었으면 이제 OpenCV 예제 프로그램을 만들어서 정상적으로 동작하는지를 확인해보겠습니다. 일단 홈디렉토리 아래에 ~/coding/HelloCV 라는 디렉토리를 만들고, 그 안에 HelloCV.cpp 파일을 아래와 같이 작성합니다.


#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
        Mat img = imread("lena.jpg");

        if (img.empty()) {
                cerr << "Image load failed!" << endl;
                return -1;
        }

        namedWindow("image");
        imshow("image", img);
        waitKey(0);
        return 0;
}


그리고 위 소스 코드를 빌드하기 위한 Makefile 파일을 아래와 같이 생성합니다. 아래 코드에서 들여쓰기(인덴트)는 스페이스가 아니라 탭(tab)입니다.


CC = g++
CFLAGS = -g -Wall
SRCS = HelloCV.cpp
PROG = HelloCV

OPENCV = `pkg-config opencv --cflags --libs`
LIBS = $(OPENCV)

.PHONY: all clean

$(PROG):$(SRCS)
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)

all: $(PROG)

clean:
    rm -f $(OBJS) $(PROG)


위와 같이 입력하고, $ make 명령어를 입력하면 HelloCV 라는 이름의 실행 파일이 생성됩니다. 그러므로 $ ./HelloCV 라고 명령어를 입력하면 프로그램이 실행되는데요.. 에러만 출력되고 종료됩니다. 왜냐하면 테스트로 사용하는 lena.jpg 파일이 없어서죠. 그러므로 opencv 소스 코드에 포함되어 있는 lena.jpg 파일을 현재 폴더로 복사합니다.

$ cp ~/opencv/opencv-3.4.0/samples/data/lena.jpg .


그리고 다시 $ ./HelloCV 명령을 입력합니다. 그러면 아래 그림처럼 lena 영상이 화면에 나타납니다. 


참 쉽죠? :-)

Posted by kkokkal
: