'QT/Examples'에 해당되는 글 4건

  1. 2015.04.15 QT로 Serial 통신 구현하기 - 1
  2. 2015.04.08 Hello World를 띄우자.
  3. 2015.04.03 QT에서 이미지 출력하는 방법
  4. 2015.03.30 Qt에서 OpenCV 사용하기

출처 : http://god10276.tistory.com/entry/QT%EB%A1%9C-Serial-%ED%86%B5%EC%8B%A0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-1


QT로 Serial 통신을 구현하려고 한다.

앞서 기본적으로 QT Creator 를 이용하여 Form을 생성하는 방법과 Button Event 등 Event 함수 등을 설정하는 방법 등에 대해서 기술하였다. 이번에는 실제 Serial 통신은 어떤 식으로 구현하는지 알아보자.

먼저 Window와 다르게 Linux는 /dev/ttyS0 -> COM1 , /dev/ttyS1 -> COM2 .... 이런 식으로 구성되고, USB to Serial 같은 경우에는 /dev/ttyUSB0 이런식으로 구분되기 때문에 따로따로 기술해 주어야 한다. 그래서 다음과 같이 정의했다.



#define DEVICE01 "/dev/ttyS0"
#define DEVICE02 "/dev/ttyS1"
#define DEVICE03 "/dev/ttyS2"
#define DEVICE04 "/dev/ttyUSB0"
#define DEVICE05 "/dev/ttyUSB1"



이런 식으로 정의하여서 사용자가 선택한 Device 장비로 Setting 될 수 있도록 하였다.

또한, BAUDRATE 같은 경우에는 <asm/termbits.h>에 정의되어 있는데 이것은 <termios.h>에 include 된다. 그러므로, <termios.h> Header File 만 Include 해 주면 된다. 

역시 편리하게 하기 위해 다음과 같은 방법으로 정의해 두었다.

#define BAUDRATE1200     B1200
#define BAUDRATE2400     B2400
#define BAUDRATE4800     B4800
#define BAUDRATE9600     B9600
#define BAUDRATE14400    B14400
#define BAUDRATE19200    B19200
#define BAUDRATE38400    B38400
#define BAUDRATE56000    B56000
#define BAUDRATE57600    B57600
#define BAUDRATE115200   B115200

기본적으로 Serial 통신을 위해 추가해 준 Header File은 다음과 같다.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>



이제 본격적인 UI 구성으로 들어가 보자.





그냥 단순하게, Terminal 창 만을 나타낼 수 있도록 구성하였다. 앞부분에서 COM Port를 설정하고 뒷 부분에서 BAUDRATE를 설정한 후에 Connect를 하면 정상적으로 Board와 통신할 수 있게 된다. 해당 UI를 포함한 클래스의 Private member로 다음과 같은 항목들을 추가해 주었다.

    QSocketNotifier *notRsRead;
    int fd;
    char buf[BUFF_SIZE];


QSocketNotifier는 <QSocketNotifier>라는 Header를 추가해 주어야 한다. 이것에 대한 자세한 설명은 추후에 기술하도록 하겠다.

또한, QSocketNotifier에 의해 동작될 Event 함수도 public slots에 정의해 주었다. 

public slots:
    void setEvent();

// pushButton 사용자 정의 함수
private slots:
       void on_connectButton_clicked();

void MainWindow::on_connectButton_clicked()
{
    /*
        #define DEVICE01 "/dev/ttyS0"
        #define DEVICE02 "/dev/ttyS1"
        #define DEVICE03 "/dev/ttyS2"
        #define DEVICE04 "/dev/ttyUSB0"
        #define DEVICE05 "/dev/ttyUSB1"

        #define BAUDRATE1200     B1200
        #define BAUDRATE2400     B2400
        #define BAUDRATE3800     B4800
        #define BAUDRATE9600     B9600
        #define BAUDRATE14400    B14400
        #define BAUDRATE19200    B19200
        #define BAUDRATE38400    B38400
        #define BAUDRATE56000    B56000
        #define BAUDRATE57600    B57600
        #define BAUDRATE115200   B115200
    */

    struct termios newtio;
    int res;

    QString temp_port, port;
    QString temp_baudrate, baudrate;

    temp_port = ui->portBox->currentText();

    if(temp_port == "ttyS0")
    {
        fd = open(DEVICE01, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS1")
    {
        fd = open(DEVICE02, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS2")
    {
        fd = open(DEVICE03, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyUSB0")
    {
        fd = open(DEVICE04, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else
    {
        fd = open(DEVICE05, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }

    memset(&newtio, 0, sizeof(newtio));

    temp_baudrate = ui->baudrateBox->currentText();

    if(temp_baudrate == "1200")
        newtio.c_cflag = BAUDRATE1200;
    else if(temp_baudrate == "2400")
        newtio.c_cflag = BAUDRATE2400;
    else if(temp_baudrate == "4800")
        newtio.c_cflag = BAUDRATE4800;
    else if(temp_baudrate == "9600")
        newtio.c_cflag = BAUDRATE9600;
    else if(temp_baudrate == "19200")
        newtio.c_cflag = BAUDRATE19200;
    else if(temp_baudrate == "38400")
        newtio.c_cflag = BAUDRATE38400;
    else if(temp_baudrate == "57600")
        newtio.c_cflag = BAUDRATE57600;
    else if(temp_baudrate == "115200")
        newtio.c_cflag = BAUDRATE115200;

    newtio.c_cflag |= CS8;
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;

    newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
    newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
    newtio.c_cc[VERASE]   = 0;     /* del */
    newtio.c_cc[VKILL]    = 0;     /* @ */
    newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
    newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
    newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
    newtio.c_cc[VSWTC]    = 0;     /* '\0' */
    newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
    newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
    newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
    newtio.c_cc[VEOL]     = 0;     /* '\0' */
    newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
    newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
    newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
    newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
    newtio.c_cc[VEOL2]    = 0;     /* '\0' */


    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);

    notRsRead = new QSocketNotifier(fd, QSocketNotifier::Read, this);
    connect(notRsRead, SIGNAL(activated(int)), this, SLOT(setEvent()));

}

void MainWindow::setEvent()
{
    int szRead;
    szRead = read(fd, buf, BUFF_SIZE);
    buf[szRead] = '\0';
    ui->textEdit->insertPlainText(buf);
    ui->textEdit->moveCursor(QTextCursor::End);
}


이게 실제 구현부이다. open을 통해 Com port를 열어 주고, BAUDRATE 설정을 통해 통신 속도를 설정해 준다. 그리고 QSocketNotifier로 Message가 오면 setEvent 함수가 동작할 수 있도록 구현하였다. 자세한 내용은 Source를 조금 읽어보면 쉽게 확인할 수 있을것이다.

여기서 중요한 부분은 

struct termios newtio;

이부분인데, 따로 정의하지 않아도 Header File안에 정의되어 있으므로 사용할 수 있다. 이 부분을 설정해주고 사용하여야 정상적인 통신이 가능하다.

'QT > Examples' 카테고리의 다른 글

Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

강좌랄것도 없음.

그냥 대충 설명하는 정도로 하겠음  .

Qt를 사용하기 위해서는 최소한 C++ 
문법은 알아야할것이다.
어쨌든 모든 프로그램들 보면 항상 "Hello World"  가 나오는걸 한다.

고로 나도 하겠음.

그리고 IDE는  이클립스던 Qt Creator 아무거나 키고 하면 됨.

이클립스의 경우 file에서 new -> Qt Gui Project를 선택 후.. next를 계속 누른다.



그리고 Project Explorer 에서 main.cpp를 찾는다. 



이후 부터는 위에꺼는 설명 안함.


소스..

#include <QtGui>
#include <QApplication>

#include <QLabel>                             //QLabel이라는걸 include 한다.
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLabel 
t("<b>Hello World</b>");         // 이렇게 처 넣는다.

    t.show();                                        //show 메소드를 호출.

    return a.exec();
}


실행 결과



위에와 같이 나온다.  Qt는 Label도 혼자서 창으로 띄울 수 있다.  
MFC도 할 수야 있겠지만 Qt 처럼 간단하게는 안됀다. 워낙 구려서..
그리고 HTML 테크가 먹힌다. Html 을 안다면 한번 해보도록 한다.

Qt는 main 부터 시작을 한다. 물론 내부적으로는 winmain이지만 프로그래머가 편하게 이런식으로 만들어져있다.
QApplication 이 클래스를 안써주면 동작을 안한다. 
나도 어떻게 돌아가는건지는 모르겠으나  QApplication이 각종 라이브러리 정보를 읽어오고 WinMain을 실행하는 것 같다. 넘어가서..

show 메소드 .. 메소드 이름이 아주 직관적이다.   보여줘라 라는 뜻으로 사용하면 결과와 같이
창이 뜬다.    이클립스 같은걸로 보면  인라인 함수로 setVisible(true) 해가지고 만들어 졌다.
setVisible 처럼 쓰기 귀찮은거 보다 show가 편한다.

그리고 이런걸 처음 해본 사람이 아니라면 그냥 http://qt.nokia.com/doc/4.6/index.html 여기 들어가서 하면 충분히 할 수 있다.

'QT > Examples' 카테고리의 다른 글

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

출처 : http://ko11011.tistory.com/trackback/8


QT에서 이미지를 로드하여 화면에 출력하는 방법을 알아보자

 

순서

QImage로 이미지를 불러온다. -> QPixmap에 옮긴다. -> QLabel에서 QPixmap를 불러와서 화면에 출력한다.

 

코드를 보며 설명하겠다.

 

 

#include <QImage>              //QImage를 사용하기 위한 라이브러리

#include <QPixmap>             //QPixmap를 사용하기 위한 라이브러리

#include <QLabel>              //QLabel를 사용하기 위한 라이브러리

#include <QMessageBox>         //QMessageBox를 사용하기 위한 라이브러리

 

//해당 함수로 이미지를 로드한다. ( 직접 제작한 함수이다.)

void MainWindow::imgload()

{

    QImage *Img = new QImage();       //이미지를 로드하기 위한 QImage 선언

    QPixmap *buffer = new QPixmap();  //버퍼로 사용할 QPixmap 선언

 

    if(Img->load(":/img/1.jpg"))      //이미지를 로드한다.

{

        *buffer = QPixmap::fromImage(*Img);   //이미지를 버퍼에 옮긴다.

        *buffer = buffer->scaled(Img->width(),Img->height()); //이미지 사이즈 조절

    }

    else // 이미지 로드 실패

{

        QMessageBox::about(0, QString::fromAscii("Image load Error"),QString::fromAscii    ("Image load Error"));

    }

 

    QLabel *lbView = new QLabel(this); //이미지를 화면에 출력할 QLabel 선언

    lbView->setPixmap(*buffer);       //버퍼에 있는 이미지를 QLabel에 출력

    lbView->resize(buffer->width(),buffer->height()); //QLabel의 크기를 이미지 사이즈에 맞추어 조절한다.

    lbView->move(0,0);                //QLabel위치 조정

    lbView->show();                   //QLabel 를 보여준다.

}

 

 

 

 

변수는 총 3개 필요하다.

1) QImage         이미지를 불러올 때 이미지라는 것을 알기 위해 사용한다.

2) QPixmap        : QLabel에 이미지를 옮길 때 사용하는 중간 버퍼

3) QLabel          실제로 화면에 출력해주기 위한 Label

 

QImage load함수를 사용하여 이미지를 로드한다.

if(Img->load(":/img/1.jpg"))   //이미지를 로드한다.

 

 

bool QImage::load ( const QString & fileName, const char * format = 0 )

 

첫번째 인자 : 파일이름이 들어간다.

두번째 인자 : 파일의 포멧이 들어간다. (생략 가능하다.)

 

리턴값 : 이미지 로드가 성공시 TRUE을 리턴하고 실패시 FALSE를 리턴한다.

 

 

QPixmap static 함수를 사용하여 QImage 변수형을 QPixmap형식으로 전환하여 옮긴다.

 

*buffer = QPixmap::fromImage(*Img);

 

 

QPixmap QPixmap::fromImage ( const QImage & image, Qt::ImageConversionFlags flags = Qt::AutoColor ) [static]

 

첫번째 인자 : 변환할 QImage

두번째 인자 : Qt::ImageConversionFlags 설정 (기본값이 설정되어있어 변경하지 않았다자세한 내용은 필자도 모른다. Qt::ImageConversionFlags를 참고 )

 

 

 

QLabel setPixmap 함수를 이용하여 QPixmap에 옮긴 이미지를 QLabel에 출력한다.

 

lbView->setPixmap(*buffer);

 

 

Public Slots

        void    setPixmap ( const QPixmap & )

첫번째 인자 : 출력할 QPixmap

'QT > Examples' 카테고리의 다른 글

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
Hello World를 띄우자.  (0) 2015.04.08
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

출처:http://blog.daum.net/goodgodgd/12


이번엔 Qt에서 opencv 설치하는 과정에 대해서 써보도록 하겠습니다.

이미 구글에 검색해보면 여러가지 비슷한 설치방법들이 나오는데요.. 제가 완결판을 만들어보겠습니다.


OpenCV 설치 방법을 간단 요약하자면

1. 다운받아서 설치한다.

2. CMake로 make 파일 만든다. (Qt 관련 설정 필요)

3. 빌드한다.

4. Qt 프로젝트 파일을 수정한다.

5. 코드에 #include <opencv2/opencv.hpp> 추가하고 OpenCV를 맘껏 쓴다.

비주얼 스튜디오를 사용하는 경우에는 직접 빌드할 필요가 없습니다. 이미 비주얼 스튜디오의 컴파일러로 빌드된 파일들을 설치시에 제공하기 때문이죠.

OpenCV코드를 직접 수정하거나 Qt같은 마이너 환경을 쓰는 경우엔 직접 빌드해야 합니다.

CMake는... 저도 아직 잘 모르겠어요. 저도 OpenCV 설치할 때만 CMake를 쓰는지라...ㅎ;;

CMake를 쓰는 이유는 (저도 잘은 모르지만) 비주얼 스튜디오 같은 통합개발환경(IDE) 없이 컴파일러만 가지고 빌드하려면 코드들 사이의 관계를 정의해주는 Makefile 이라는게 필요한데 코드가 많은 복잡한 프로젝트의 경우 Makefile을 직접 작성하기가 지랄맞게 어렵다고해서 그것보다 좀 더 쉬운 문법으로 CMakeLists.txt를 써주면 CMake 프로그램에서 알아서 Makefile을 만들어주겠다.... 는 거라네요. (그럼 애초에 Makefile을 만들기 쉽게하던가..;;)

암튼 OpenCV는 설치시 CMakeLists.txt를 제공하고 그래서 CMake로 빌드할 준비를 해야한다는 겁니다.


이제 본론 갑니다.


일단 OpenCV를 다운받아서 설치를 해야겠죠?

http://opencv.org/downloads.html

그런데 제가 해본 결과 3.0 버전은 Qt로 빌드가 잘 되지 않습니다. 그러니 일단 OpenCV 2.4.9 버전을 설치해주세요.

(3.0으로 Qt 잘 돌리시는 분 있음 댓글로 팁좀 주세요;;;)

저는 이미 구버전이 깔려있어서 헷갈리지 않게 C:\opencv_249 에 설치했습니다.

그리고 CMake도 설치해 주세요.

http://www.cmake.org/download/ 

윈도우라면 Binary distributions에 Windows (Win32 Installer) 이걸로 설치하는게 편할겁니다.


CMake를 실행하기 전에 먼저 시스템 환경변수를 설정해줘야 합니다.

이걸 안하면 아예 Configure부터 막힙니다;;

아래 그림대로 쭉 따라가세요.



저기서 저 Path란 변수에 Qt를 이용한 빌드에 필요한 경로를 추가해줍니다.

C:\Qt\5.3\mingw482_32\bin;C:\Qt\Tools\mingw482_32\bin;C:\Qt\Tools\QtCreator\bin;


처음에 설치 방법 소개했을때 말한 MinGW를 사용하는 것입니다.

절대 Path의 기존 경로들을 지운다거나 그런 실수는 하지 마세요;;; 위 경로를 추가!하는 겁니다.

시스템변수를 설정했으니 이제 CMake를 실행하는 것이... 아니고 일단 컴퓨터를 리부팅 해줘야 수정한 경로가 적용됩니다. Reboot!!


이제 진짜 CMake를 실행해서 다음과 같이 경로를 설정해 봅시다.

Where is the source code: 에는 OpenCV 설치 폴더에 들어있는 sources 폴더의 경로를 적어주면 되고

Where to build the binaries: 에는 빌드할 폴더를 지정합니다. sources 옆에 build라는 폴더는 이미 있기 때문에 다른 폴더 이름을 지정합니다.

Qt debug 모드에서 사용할 바이너리 파일을 만들기 위해 build_qt_debug란 이름을 붙였습니다. Release 모드로 쓸거라면 build_qt_release라고 했겠죠.

근데 debug 모드랑 release 모드랑 빌드를 따로해야 하냐구요? 맞습니다. 어떻게 하냐구요? 뒤에 나옵니다. 왜 그래야 하냐구요? 물론 공용으로 빌드해도 어느정도 돌아가긴 합니다.

그런데 몇가지 기능이 제대로 동작하지 않는것을 보고 저도 디버그 모드로 다시 빌드했습니다.

예를들면 imshow()로 이미지를 새 창에 띄우고 나서 똑같은 window name으로 다른 이미지를 imshow() 했는데 그림이 바뀌지 않더란 말입니다;;;


그리고 Configure를 누릅니다. 빌드 폴더가 없으면 만들겠냐고 물어보는데 당연히 Yes!

그러면 어떤 컴파일러로 OpenCV를 빌드할 것인지 아래와 같이 설정해줍니다.

Qt 설치시 MinGW를 선택하였으므로 Qt에서 설치해준 mingw 컴파일러를 지정합니다.


이제 Finish를 누르면 configure가 진행됩니다. 아까 환경변수를 수정하고 재부팅!까지 해주지 않았다면 여기서 바로 에러뜨고 막힙니다.

Configure가 약간 시간이 걸리는데 끝나고 나면 다음과 같은 화면이 뜹니다. 빨간색이 아니어도 에러만 안뜨면 괜찮습니다.


Configuring done 이라고 뜨지만 끝난것은 아닙니다. 여기가 핵심 비법이라고 할수 있는데요ㅋ

위에 search 창에 qt라고 검색해서 WITH 아래 WITH_QT를 체크해줍니다. WITH 옆에 화살표가 안보인다고 당황하지 마세요!

마음의 눈으로 화살표가 있을만한 왼쪽에 빈 공간을 눌러주면 아래 항목이 나옵니다.


또한 cmake로 검색해서 cmake 아래에 CMAKE_BUILD_TYPE에 Debug라고 씁니다. 그리고 Configure를 몇 번 더 눌러주세요.


Configure 다음은 Generate 입니다. 이건 한번만 실행하면 됩니다. 그럼 이렇게 빌드폴더에 갖가지 파일과 폴더.. 그리고 Makefile이 생겼음을 볼 수 있습니다.


이제 드뎌 진짜!! 빌드를 할 차례입니다.

윈도우키+R 로 "실행"을 실행시키고 cmd라고 쓰고 엔터!치면 콘솔창이 나옵니다. 그리고 아래와 같이 make 합니다.

>c:\opencv_249\opencv\build_qt_degub

>mingw32-make



그럼 한참동안 컴퓨터가 빌드하고 있을겁니다. 10분이상 걸릴테니 잠깐 딴짓을 해도 좋습니다.

그런데 제가 집컴에서는 빌드가 한방에 되는데 회사에서 하면 자꾸 중간에 멈춰서 진행이 안되고 다시 빌드하고 그런 것을 반복해야 했는데 왜 그런지는 모르겠습니다. 잘 되고 있나 한번씩 확인해주세요.

다 되고 나면 이런 화면이 뜰겁니다. 다음은 mingw32-make install 입니다. make install을 하면 빌드된 곳으로 소스코드까지 다 복사가 됩니다.


끝나면 결과는 이렇게...


이제 설치는 끝났습니다. 몇 가지 설정만 더 해주면 사용할 수 있습니다.

초반에 보였던대로 빌드해서 만든 opencv의 dll 파일들을 우리 프로젝트에 링크시킬려면 (즉 opencv를 사용하려면) 위에서 한대로 

시스템 속성 - 환경변수로 들어가서 Path에 다음 경로를 추가해야 합니다.

C:\opencv_249\opencv\build_qt_debug\bin


그리고 역시 재부팅을 해줍니다. 이걸 건너뛰고 프로그램을 실행하면 다음과 같은 메시지를 보며 한참을 머릴 쥐어뜯으며 구글을 헤메이게 될 것입니다.ㅎㅎ 

(절대 경험담 아님;;)


이제 드디어!! Qt를 켜봅시다.

QtOpenCVTest라는 Qt Widgets Application 프로젝트를 만들었습니다.


비주얼 스튜디오에서도 opencv를 사용할 때 프로젝트 속성에서 opencv 경로를 설정해줬듯이 Qt에서는 .pro 파일에서 경로를 지정합니다.

왼쪽 위에 QtOpenCVTest.pro 파일을 열어 다음 경로와  dll 파일들을 추가합니다. 아래 지정한 dll 파일들은 기본적인 것들이고 필요에 따라 빼거나 추가할 수 있습니다.

INCLUDEPATH += C:\opencv_249\opencv\build_qt_debug\install\include


LIBS += C:\opencv_249\opencv\build_qt_debug\bin\libopencv_calib3d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_contrib249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_core249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_features2d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_highgui249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_imgproc249d.dll \



반드시 프로젝트 파일을 수정한 후에는 Ctrl+S로 저장을 해줘야 효과가 나타납니다.

그리고 헤더 파일 mainwindow.h 에 opencv 헤더 파일을 인클루드합니다. 이후 예제를 위해 파일다이얼로그 클래스와 문자열 클래스도 추가합니다.

#include <opencv2/opencv.hpp>

#include <QFileDialog>

#include <QString>


이제 OpenCV를 쓸 수 있습니다. 위젯에 버튼하나 추가해서 버튼을 누르면 이미지 하나를 열어서 보여주는 예제를 만들겠습니다.

버튼하나 추가하고 우클릭 - Go to slot - clicked() 선택해서 연결함수를 생성합니다.


void MainWindow::on_pushButton_clicked()
{
    QString qsfileName = QFileDialog::getOpenFileName(this,
        tr("Open Image"), "../", tr("Image Files (*.png *.jpg *.bmp)"));
    cv::Mat image = cv::imread(qsfileName.toStdString());
    cv::imshow("Hello OpenCV", image);

}


파일 다이얼로그를 열어서 파일을 선택하고 그 파일을 열어서 보여주는 간단한 함수입니다. 파일명의 형태를 std::string으로 바꿔주기 위해 .toStdString() 함수가 들어갔습니다.

이제 실행해서 버튼을 누르고 이미지 파일을 열어봅시다. Voila!!


역시 비전 관련 예제는 레나가 나와야 제맛!!

여기까지 잘 따라오셨다면 축하합니다. 하지만 삽질은.. 이제부터 시작이겠죠?

별 내용도 아닌데 캡쳐로 도배를 했더니 페이지수만 많아졌네요;;

저도 이 과정을 완전히 이해한 것은 아니라 수정/태클/지적질 환영합니다.

그럼 다음 삽질때 봐요~

'QT > Examples' 카테고리의 다른 글

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,