드디어 오늘 본격적인 Mat클래스를 배우게 되는데!

opencv하면서 IplImage처럼 반드시 쓰이는 그런 클래스입니다!!!

Mat함수는 다필요없고 그냥 오늘하는거만 배웠다가 나중에 응용되어 나오면 그때가서 배우면 되용!


일단 소스부터 ㄱㄱ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main(void)
{
    Mat A(23, CV_8UC1);
    Mat B(23, CV_8UC1, Scalar(0));
    Mat C(23, CV_8UC3, Scalar(123));
 
    cout << A << endl;
    cout << B << endl;
    cout << C << endl;
    system("pause");
    return 0;
}
cs


결과는?


1
2
3
4
5
6
7
[205205205;
 205205205]
[  0,   0,   0;
   0,   0,   0]
[  1,   2,   3,   1,   2,   3,   1,   2,   3;
   1,   2,   3,   1,   2,   3,   1,   2,   3]
 
cs

결과는 이렇게 나옵니다 설명해보면


6번줄에 Mat A 가 선언되어있고 괄호안에 2,3 이 있는데 이는 2x3의 배열을 생성하겠다는 소리에요@@ CV_8UC1 이건자료형이래요 초반엔 몰라도 별지장없음!

그래서 2x3행렬에 초기화를 해주지않았으므로 결과창에 205라는 임의의 값이 들어간 듯합니다!

그리고 Mat B를 보시면 Scalar(0)으로 초기화를 해놨죠? 그래서 결과에 전부 0이 나온겁니다.

Mat C를 보시면 CV_8UC3으로 되어있져? 처음에 저는 CV_8UC1로 해서 결과가 1,1,1,1,1,1,1로 나와서 당황했는데 알고보니 8UC3으로 했어야 됬더라구요

초기화는 각각1,2,3 으로 초기화 되었씁니다!!@@!@#

보통 Mat행렬이라고 부르는데 이유는 엄청큰 행렬속에 1채널, 다채널 등의 수치데이터를 집어넣고 사용하기 때문입니다

그런데말입니다. Mat에대한것은 프로그래밍을 하면서 접해보는게 짱입니다. Mat클래스중에 잘 안쓰는 함수도 많거덩요 물론 깊이파고들면 많이사용하겠지만...ㅋㅋ

암튼 Mat에관련되서 앞으로 쓸 포스팅에 있으면 설명 넣어드리겠습니다!! 다음엔 그냥 바로 그래픽 출력으로 가봅시다!@

'OpenCV' 카테고리의 다른 글

Scalar_ 클래스  (0) 2016.12.07
Rect_ 클래스  (0) 2016.12.07
Size_ 클래스  (0) 2016.12.07
Point3_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07

저번에 사칙연산 예기 안한다고했는데 해버렸음 물론 지금도 하는중이지만..... 내맘대로해야지@@ㅋㅋ

이번시간엔 Scalar에 대해 배울것이다!! 

Scalar : [명사] <물리> 하나의 수치만으로 완전히 표시되는 양. 벡터, 텐서 따위의 유방향량(有方向量)에 대하여 방향의 구별이 없는 수량이다. 예를 들면, 질량ㆍ에너지ㆍ밀도ㆍ전하량 따위를 나타내는 수이다. 

요따구로 나오는데 다필요없다. opencv에서만은 그냥 색깔이다. 색중에서도 RGB.

소스나봅세~


1
2
3
4
5
6
7
8
9
10
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
    Mat img(200200, CV_8UC3, Scalar(000));
    imshow("img", img);
    waitKey();
    return 0;
}
cs


완전쉽다 ㅋㅋㅋㅋ


결과로는 그냥 검은창이 뜰것이다. 귀찮아서 결과사진 안올렸어요~~~

검은창만뜨는 이유는 Scalar에서 0,0,0 RGB모두 0을 넣어줬기 때문이다.

저번 게시글에 적어놨지만 다시적어보면 Scalar(1,2,3) 에서 3이 Red 2가 Green 1이 Blue이다!

다양한 색을 출력해보고 싶으면 구글에 검색해보던가~ 직접 노가다해보던가~~~이다.

ㅋㅋ 수고했다.! 끝이에요!@@@@@


다음엔 본격적인 Mat클래스를 해보도록 합시다@@ Mat끝내면 웬만한 클래스는 다끝난걸꺼에요ㅎㅎ

암튼 날로먹는 이번게시물 ㅋㅋ 빠이!

'OpenCV' 카테고리의 다른 글

Mat_ 클래스  (0) 2016.12.07
Rect_ 클래스  (0) 2016.12.07
Size_ 클래스  (0) 2016.12.07
Point3_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07

Rect 클래스.. 뭔가 Rectangle 이 느껴지지않아요??ㅋㅋㅋ 나만그런가 ㅋㅋ 암튼! 사각형을 표현하는 함수에용~~~

이거도 사칙연산이 된다구 하네요. Rect클래스 안에 많은 함수가 포함되어있지만 여기서 다루기엔 좀 급한감이 있고 필요할때마다 배우면서 사용해도 될거 같아서 일단은 대략적인 설명만 해둘게요~


소스 ㄱㄱ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
    Rect rt1(100100320240);
    cout << "rt1: (" << rt1.x << "," << rt1.y << "," << rt1.width << "," << rt1.height << ")" << endl;
 
    cout << "rt1:" << rt1 << endl;
 
    Mat img(600800, CV_8UC3);
    namedWindow("img", WINDOW_AUTOSIZE);
    rectangle(img, rt1, Scalar(25500), 2);
    imshow("img", img);
    waitKey(); 
    return 0;
}
cs



결과?





아주잘나오네요~~ 일단 소스를 설명하자면

Rect rt1(100, 100, 320, 240);

요건 왼쪽위가 100,100 이라는 소리이고 100,100 으로부터 가로가 320 세로가 240 이라는 소리입니당! x,y좌표(앞에 100,100) 생각하시면 될듯해요!


cout << "rt1:" << rt1 << endl;

여기서 나온 결과처럼 320 x 240 from 100,100 => 100,100 에서 320 x 240 사이즈의 크기를 가지고있는 커다란 구조체이죠.



Mat img(600, 800, CV_8UC3);

이게 무엇이냐! Mat행렬이라는 함수인데 뒤에가면 조금더 자세히알려드리니 걱정마시고 그냥보시기만!!!

600x800짜리 창을 하나 만들겠다는 소리에요. 뒤에 CV_8UC3은 상수인데 opencv에서 그냥 정해둔듯!


rectangle(img, rt1, Scalar(255, 0, 0), 2);

rectangle함수인데 여기서 img에 rt1으로 정의된 사각형을 scalar(255,0,0)의 색으로 두께는 2만큼인 사각형을 그려놓으란 소리에요


그래서 imshow함수로 자료형이 Mat인 img 를 출력해줘서 저렇게 파란 사각형이 뜨게 되는것이구요.ㅎㅎ

참고로 scalar(255,0,0)은 bgr순서로 맨앞이 blue 중간이 green 마지막이 red인것 같아요!


그리고 waitKey() ..-> 사용자의 키를 입력받기를 기다리는거죠

입력받으면 바로꺼짐!

무튼~~ Rect_클래스에 대해서 대략적으로 알아보는 시간이었습니다!!!! 다음엔~~Scalar 클래스에대해서 알아보겠습니다!!@@@@@




 

'OpenCV' 카테고리의 다른 글

Mat_ 클래스  (0) 2016.12.07
Scalar_ 클래스  (0) 2016.12.07
Size_ 클래스  (0) 2016.12.07
Point3_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07

웬만한 클래스는 전부 사칙연산이 가능한가보다. 그러므로 앞으로 사칙연산예기는 안하것음(귀차나)..ㅋㅋㅋㅋ


그럼 본격적으로 시작해보면!


Size_ 클래스!   말그대로 Size! 크기! 크기를 나타내는 함수이다!  Size2i, Size, Size2f 등이있다는데 우리는 Size만 쓸것이다! 왜냐? Size하나 익숙하게 해놓고 나중에 필요하면 찾아서 응용하면되니깐~


항상 패턴이 일정할거 같은데,,,,, 함수 설명잠깐하고 바로 소스로 넘어갈것 같다.


소스보자!


1
2
3
4
5
6
7
8
9
10
11
12
13
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
    Size size1(100100), size2(200200);
    cout<<"Size1 = "<<size1<<endl;
    cout<<"Size2 = "<<size2<<endl;
    
    if(size1 == size2)
        cout<<"same!"<<endl;
    return 0;
}
cs


결과는?


1
2
3
size1 = (100100)
size2 = (200200)
 
cs


결과를 내가 직접 손으로 작성하기때문에 컴퓨터가 출력해주는 결과와 괄호모양이 다를수도있고 띄어쓰기도 다를수 있으니깐 유의하세요!! 숫자는 안바뀔것이요!!!!


size1을 100x100으로 설정하고 size2는 200x200으로 설정해놓은거에요

그리고 10번줄을 보면 같은지 보고있는데 둘이 크기가 다르니 출력x !


또 끝임.. 초반엔 너무쉬운듯하지만 잘복습해두시길! 나중에 많이 사용하니깐!!!!!

다음엔 사각형인 Rect_함수를 설명해줄께요!!! 빠빠

 

'OpenCV' 카테고리의 다른 글

Scalar_ 클래스  (0) 2016.12.07
Rect_ 클래스  (0) 2016.12.07
Point3_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07
DataType 클래스  (0) 2016.05.07

우리는 당연히 1차원이 아닌 2차원부터 시작하므로 Point_에 숫자가 없더라도 2차원 좌표를 표현한다고 생각해야한다. 1x를 그냥 x로 표현하듯이...(표현이 적절한가..?)

아무튼!! 그렇다면 Point3_ 클래스는 당연히 3차원을 표현해 줄 것이다.

물론 연산자 사용 가능이다. 무슨소리냐면 Point3_클래스끼리 사칙연산이 된다는 소리임!

소스로 보는게 편하니깐 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
    Point3f pt1(1.0f, 0.0f, 0.0f), pt2(0.0f, 1.0f, 0.0f);
    cout<<"pt1" = <<pt1<<endl;    
    cout<<"pt1" = <<pt1<<endl;
    if(pt1 != pt2)
        cout<<"Different pt1, pt2"<<endl;
    return 0;
}
cs


결과는?


1
2
3
pt1 = [100]
pt2 = [010]
Different pt1, pt2
cs


Point3f pt1(1.0f, 0.0f, 0.0f)에서 1.0f, 0.0f, 0.0f 이것들은 각각 x, y, z를 지칭하는 거에요. 참쉽죠?

pt1 과 pt2 내용물이 달라서 연산결과는 false -> 따라서 출력이 되구요.


끝인데......



다음엔 Size_클래스 알려줄께여~


 

'OpenCV' 카테고리의 다른 글

Rect_ 클래스  (0) 2016.12.07
Size_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07
DataType 클래스  (0) 2016.05.07
opencv의 기본 클래스!!  (0) 2016.05.06

요즘 클래스에 대해서 글을 적고있긴한데 나도 지식이 부족하다보니 책에 의존하는 경향이 있긴하다. 하지만 내가 이해한것을 바탕에 두고 부족한 부분이나 애매한 부분을 책에 의존하고 있기 때문에 생초보들도 보고 따라하면 이해는 갈 것이다.(안갈수도..ㅠㅠ)


뭐가 됫든간에 이번엔 Point_ 클래스에 대해 알아볼 것이다. 


저어번 포스트에 Point_클래스는 2D좌표를 표현하는 클래스라고 적어놓은것이 있다. (한번씩 보고오길 바람. 웬만한 클래스는 다 적어놨어요.)


다들 C언어 하실때 typedef 구조체 정의하시는거 배우셧죠??? (C언어 배우고 opencv를 해야 이해하기 편합니당. 안배우셨다면 약간 힘드실수도..) 그 typedef 를 사용하여 정의한 Point2i.,Point, Point2f, Point2d 자료형이 있답니다. 거기서 제생각엔 point를 제일 많이 사용하는거 같기도 해요.. 물론 내 생각..

이 자료형들로 +,-,*,=,==,!= 등의 연산자를 사용할수 있어요!


소스보시죠!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
    Point2f pt1(0.1f, 0.2f), pt2(0.3f, 0.4f);
    
    Point pt3 = (pt1 + pt2)*10.0;
    
    cout << "pt1:" << pt1 << endl;
    cout << "pt2:" << pt2 << endl;
    cout << "pt3:" << pt3 << endl;
 
 
    cout << "pt1(" << pt1.x << "," << pt1.y << ")" << endl;
    cout << "pt2(" << pt2.x << "," << pt2.y << ")" << endl;
    cout << "pt3(" << pt3.x << "," << pt3.y << ")" << endl;
 
    if (pt1 == pt2)    cout << "1,2 same" << endl;
    else cout << "1,2 different" << endl;
 
    return 0;
}
cs



결과보시죠!


1
2
3
4
5
6
7
8
9
pt1:[0.1, 0.2]
pt2:[0.3, 0.4]
pt3:[4, 6]
pt1(0.1,0.2)
pt2(0.3,0.4)
pt3(4,6)
1,2 different
 
 
cs









제가 가끔가다가 메인함수 안에 freopen("output.txt","w",stdout);

이걸 쓸때도 있고 안쓸때도있는데 이유가 결과를 여기다가 올리려고 output 텍스트 파일에 결과를 받아적는거에요. 그래서 있던없던 프로그램 내용엔상관없으니 혼동하지마셔요! 


결과로 돌아와서 Point pt1 이라고 변수를 선언하고 pt1 적은다음 pt1바로 옆에 점을 하나 찍으면 x좌표를 사용할수도 있고 y좌표를 사용할 수도 있습니다. 연산도 가능하다는거 잊지마시고!

 point_ 이 클래스는 2차원이다!! 알아두셔요!!!!! 끝!

'OpenCV' 카테고리의 다른 글

Size_ 클래스  (0) 2016.12.07
Point3_ 클래스  (0) 2016.12.07
DataType 클래스  (0) 2016.05.07
opencv의 기본 클래스!!  (0) 2016.05.06
opencv 히스토그램 그리기  (0) 2016.03.20

일단 datatype 클래스에 대해 설명을 하면 opencv기본 자료형을 표현하기 위한  템플릿클래스이다. 

 뭔소리냐면... CV_8U , CV_8UC3 이런거다! 나중에가면 많이보게 될 것이니 걱정 No.

 또 CV_8U , CV_8UC3 이게 뭔소리냐면.... 그냥 상수이다. 고정된 수라고 하지요.


나중에 프로그래밍 할때 보면 알겠지만  datatype 을 CV_8U , CV_8UC3 이렇게 쓰지 아무도 DataType<Vec<uchar, 3>>::type 요따구로 쓰지않음.. 귀찮기 때문에!


 datatype을 사용한 코드를 보자!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
    freopen("output.txt""w", stdout);
    Mat img(12, DataType<uchar>::type);
    // Mat imag(1,2,CV_8U);
    img.at<uchar>(00= 1
    img.at<uchar>(01= 2;
    cout << "img" << img << endl;
     
    return 0;
}
 
cs

 이렇긴 한데 사용하기 편리한 CV_8U 이런걸 내비두고 그 누가 DataType<uchar>::type 이것을 사용하겠는가!

무튼 여기선 더이상 설명할게 없다.

하나만알아두자! CV_8U 이런건 상수이니 보고서 쫄지말자!

'OpenCV' 카테고리의 다른 글

Point3_ 클래스  (0) 2016.12.07
Point_ 클래스  (0) 2016.05.07
opencv의 기본 클래스!!  (0) 2016.05.06
opencv 히스토그램 그리기  (0) 2016.03.20
opencv 원그리기  (0) 2016.03.20

DataType    기본 탬플릿 클래스

Point_      2D points의 템플릿 클래스

Point3_     3D points의 템플릿 클래스

Size_       영상 또는 사각형의 크기 템플릿 클래스

Rect_       2D 사각형 템플릿 클래스

RotatedRect 회전 가능한 사각형. (CVBox2D)

TermCriteria반복 알고리즘에서 종료 조건 클래스

Matx        작은 크기의 행렬

Vec         짧은 수치 벡터

Scalar_     4-요소 벡터

Range       시퀀스의 부분 시퀀스(slice)

Ptr         스마트 참조 포인터

Mat         행렬 클래스

 

 

많이쓰일것이니 잘보길바람!

'OpenCV' 카테고리의 다른 글

Point_ 클래스  (0) 2016.05.07
DataType 클래스  (0) 2016.05.07
opencv 히스토그램 그리기  (0) 2016.03.20
opencv 원그리기  (0) 2016.03.20
opencv 선,사각형 그리기  (0) 2016.03.20

오늘 할거는 히스토그램 그리는건데여, 히스토그램..만만치 않습니다... 갑자기 이렇게 어려운거로 건너뛰기를 한 이유는... 그냥!!


히스토그램은 관찰 데이터의 빈도수를 막대그래프로 표시한것으로 확률 밀도정도를 표시할수잇다. 그냥 얼마나 그러한색상이 모여잇고 복잡한가 정도를 나타내는 것이에요! 그렇다면...!!


항상그래왔듯이 소스 보시죠!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#include "opencv.hpp"
using namespace std;
using namespace cv;
void histogram(int histSize, float valueRange[], const float*ranges[], int channels, int dims)
{
    Mat srcImage = imread("lena.jpg", IMREAD_GRAYSCALE);
    if (srcImage.empty())
        return;
    Mat hist;
    calcHist(&srcImage, 1, &channels, Mat(), hist, 1, &histSize, ranges);
 
    Mat histImage(512512, CV_8U);
    normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F);
 
    histImage = Scalar(255);
    int binW = cvRound((double)histImage.cols / histSize);
    int x1, y1, x2, y2;
    for (int i = 0; i < histSize; i++)
    {
        x1 = i*binW;
        y1 = histImage.rows;
        x2 = (i + 1)*binW;
        y2 = histImage.rows - cvRound(hist.at<float>(i));
        rectangle(histImage, Point(x1, y1), Point(x2, y2), Scalar(0), -1);
    }
    imshow("histImage", histImage);
}
int main()
{
    int histSize[10= {128,256,512};
    float valueRange[] = { 0256 };
    const float * ranges[] = { valueRange };
    int channels = 0;
    int dims = 1;
    for (int i = 0; i < 3; i++)
    {
        histogram(histSize[i], valueRange, ranges, channels, dims);
        waitKey();
    }
 
    return 0;
}
cs



보시면 처음보는게 많습니다. calcHist라든가 normalize라든가 cvRound... histImage.cols... 

그래도 다알려줄게!


calcHist 이함수는 영상의 히스토그램값을 계산하는 함수라는데... 그냥 히스토그램 그리기위한 준비단계 제일처음!

별로 설명해줄게 없음...


normalize함수는 hist를 NORM_MINMAX로 범위가 [0,histimage,rows]가 되도록해서 히스토그램 최소값은 0, 최대값은 histimage.row로 해놓는 함수임. NORM_MINMAX 이건 상수에요! opencv에서 정해놓은 속성을 그냥 가져다 쓰는거임.


cvRound 는 정수형으로 변환할때 반올림을 하기위해서 쓰는거임. 반올림 무시해버리면 안되는거죠~ 쉬운개념이죠!





for (int i = 0; i < histSize; i++)

    {
        x1 = i*binW;
        y1 = histImage.rows;
        x2 = (i + 1)*binW;
        y2 = histImage.rows - cvRound(hist.at<float>(i));
        rectangle(histImage, Point(x1, y1), Point(x2, y2), Scalar(0), -1);
    }


이건 걔산된 히스토그램을 막대로 보이게 하기위해서 설정하는것임.




이렇게하면 히스토그램이 그냥나와버리네요. 제가 히스토그램 그리는걸 함수로 따로 해놓은 이유는 히스토그램 막대기 갯수를 다르게 해보고싶어서엿어용.


히스토그램 사용하는곳은 물체비교! 손인식에도 쓸수 잇죠! 등등 예시는 많이는 모르겟어요...ㅋㅋ;; 메마른 지식.



음 일단이걸로 히스토그램은 마치구.. 나중에 히스토그램 나올때 설명 더 자세히 하도록하구 다음포스트에서 봅시다@@ 



'OpenCV' 카테고리의 다른 글

DataType 클래스  (0) 2016.05.07
opencv의 기본 클래스!!  (0) 2016.05.06
opencv 원그리기  (0) 2016.03.20
opencv 선,사각형 그리기  (0) 2016.03.20
OPENCV 시작!!  (0) 2016.03.20

이번엔 원을 그려볼껀데염

그냥 도형그리는건 다똑같나봄. 함수인자들이..


소스@@

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
    Mat dstImage(1024,1024, CV_8UC3, Scalar(255255255));
    rectangle(dstImage, Point(100100), Point(10001000), Scalar(00255));
    line(dstImage, Point(550100), Point(5501000), Scalar(00255));
    line(dstImage, Point(100550), Point(1000550), Scalar(00255));
    circle(dstImage, Point(500550), 512, Scalar(02550), -1);
    imshow("DstImage", dstImage);
    waitKey();
    return 0;
}
 
cs


실행결과@@




사진 크기를 줄이는 방법을 생각해봅시다.


저번시간에 이거 설명 안한거같은데

Mat dstImage(1024,1024, CV_8UC3, Scalar(255255255));



여기서 1024 1024 는 가로세로 크기를 말하구요. 그래서 작게 만들고 싶으면 1024를 512,256,128 등등으로 바꿔주심되여.

scalar역시 색상이구요 (255,255,255)는 흰색이에요 0,0,0 해보시면 까맣게 되뿌림..ㅋㅋ


circle(dstImage, Point(500550), 512, Scalar(02550), -1);



circle함수는 직선하구 사각형하고는 약간다르네여. Point가 하나임!! 이유는??

당연히 중심은 하나뿐이니까여! 512라고 적어둔것은 반지름입니다 ㅎㅎ 크기줄이려면 512저부분을 줄여야 하구요!


그럼 원 설명 끝났음 ㅋㅋㅋㅋㅋㅋㅋ 간단간단!! ㅋㅋ


다음포스트에서 봅세!


'OpenCV' 카테고리의 다른 글

DataType 클래스  (0) 2016.05.07
opencv의 기본 클래스!!  (0) 2016.05.06
opencv 히스토그램 그리기  (0) 2016.03.20
opencv 선,사각형 그리기  (0) 2016.03.20
OPENCV 시작!!  (0) 2016.03.20

+ Recent posts