코드:

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
#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main() {
    Mat image = imread("boldt.jpg"); //read a image
    Mat hsv;
    cvtColor(image, hsv, COLOR_BGR2HSV); //convert BGR to HSV
    vector<Mat>  channels;
    split(hsv, channels); //split to h,s,v
    //channels[0] 색상(H),  channels[1]  채도(S),  channels[2]  명도(V)
    //각 채널 출력
    imshow("Original", image); //original
    imshow("Hue", channels[0]); //hue
    imshow("Saturate", channels[1]); //saturate
    imshow("Value", channels[2]); //value
    channels[2= 255//value to max
    merge(channels, hsv); //merge h,s,v
    Mat newImage;
    cvtColor(hsv, newImage, COLOR_HSV2BGR); //convert HSV to BGR
    imshow("Fixed Value Image", newImage);
    waitKey(0);
 
    return 0;
}
 
cs

 

실행결과:

 

설명:

cvtColor(image, hsv, COLOR_BGR2HSV); 

눈치가 빠르다면 단번에 코드의 의미를 파악할 수 있다. cvtColor()함수를 이용하여 COLOR_BGR2HSV 즉 BGR이미지에서 HSV이미지로 변환시키는 코드.

 

    vector<Mat>  channels;

    split(hsv, channels); 

개인적으로 신기했던 코드. Mat형식의 벡터를 만든다음 split()함수를 이용하여 각 벡터에 H, S, V의 이미지를 저장.

 

이후 코드는 이해가능할 것이다.

'C,C++ > Opencv, c++' 카테고리의 다른 글

Opencv, c++, threshold()  (0) 2019.10.04
Opencv, c++, imshow, imwrite  (0) 2019.10.04
Opencv, c++, video 출력  (0) 2019.09.22
Opencv, c++, Rectangle 출력  (0) 2019.09.22

코드:

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
44
#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main() {
    vector<int> params_jpg, params_png;
    params_jpg.push_back(IMWRITE_JPEG_QUALITY);          //JPG로 화질 설정
    params_jpg.push_back(95);
    params_png.push_back(IMWRITE_PNG_COMPRESSION);       //PNG 압축레벨 저장
    params_png.push_back(3);
 
    Mat image = imread("puppy.bmp");
    if (image.empty()) {
        cout << "Image unloaded" << endl;
        return 0;
    }
 
    imwrite("output.jpg", image, params_jpg); //puppy.bmp->output.jpg
    Mat image_1 = imread("output.jpg");
    if (image_1.empty()) {
        cout << "Image unloaded" << endl;
        return 0;
    }
 
    imwrite("output2.png", image, params_png); //puppy.bmp->output2.png
    Mat image_2 = imread("output2.png");
    if (image_2.empty()) {
        cout << "Image unloaded" << endl;
        return 0;
    }
 
    imshow("original image", image);
    imshow("output image", image_1);
    imshow("output image2", image_2);
 
    waitKey(0);
 
 
 
}
 
cs

실행결과:

 

설명:

    vector<int> params_jpg, params_png;

    params_jpg.push_back(IMWRITE_JPEG_QUALITY);          //JPG로 화질 설정

    params_jpg.push_back(95);

    params_png.push_back(IMWRITE_PNG_COMPRESSION);       //PNG 압축레벨 저장

    params_png.push_back(3);

imwrite에 매개변수로 벡터를 넣기 위해 벡터를 만드는 과정.

이저 버전에서는 

imwrite("output.jpg", image, IMWRITE_JPEG_QUALITY, 95)

이런식으로 코드를 짜도 실행이 됐었지만 현재 최신 버전에서는 에러로 뜬다. 

그래서 위에 코드처럼 벡터를 따로 만들어서 벡터값을 매개변수로 넣어야함...

 

    Mat image = imread("puppy.bmp");

    if (image.empty()) {

        cout << "Image unloaded" << endl;

        return 0;

    }

imread 이미지를 가져오는 코드

 

    imwrite("output.jpg", image, params_jpg); //puppy.bmp->output.jpg

    Mat image_1 = imread("output.jpg");

    if (image_1.empty()) {

        cout << "Image unloaded" << endl;

        return 0;

    }

원본 이미지를 jpg로 압축하여 저장하고 다시 불러와서 image_1이라는 변수에 저장.

 

    imwrite("output2.png", image, params_png); //puppy.bmp->output2.png

    Mat image_2 = imread("output2.png");

    if (image_2.empty()) {

        cout << "Image unloaded" << endl;

        return 0;

    }

마찬가지로 png로 압축한 뒤 불러오기.

 

    imshow("original image", image);

    imshow("output image", image_1);

    imshow("output image2", image_2);

이미지 보여주기.

 

'C,C++ > Opencv, c++' 카테고리의 다른 글

Opencv, c++, threshold()  (0) 2019.10.04
Opencv, c++, cvtColor(), split(), merge()  (0) 2019.10.04
Opencv, c++, video 출력  (0) 2019.09.22
Opencv, c++, Rectangle 출력  (0) 2019.09.22

오버로딩이란 객체 생성시 생성자 함수를 같은 이름으로 여러개 정의함으로써

각기 다른 매개변수를 받으면서 같은 이름의 함수를 호출하는 것을 의미함.

 

코드:

 

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
 
public class Book {
    String title;
    String author;
    void show() {
        System.out.println(title + "/" + author);
    }
 
    public Book() {
        this("","");
        System.out.println("생성자 1호출됨");
    }
    public Book(String title) {
        this(title, "작자미상");
        System.out.println("생성자 2호출됨");
    }
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
        System.out.println("생성자 3호출됨");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Book littlePrince = new Book("어린왕자""생텍쥐페리");
        Book loveStory = new Book("춘향전");
        Book emptyBook = new Book();
        littlePrince.show();
        loveStory.show();
        emptyBook.show();
    }
 
}
 
cs

 

실행결과:

 

설명:

위의 book함수를 보면

public Book()

public Book(String title)

public Book(String title, String author)

이렇게 세 개의 생성자 함수를 갖고 있다.

 

Book littlePrince = new Book("어린왕자""생텍쥐페리");

이 코드는 세번째 생성자 함수를 호출했다.

 

Book loveStory = new Book("춘향전");

두번째 생성자 함수를 호출한 코드인데 실행 결과를 보면 생성자 3이 먼저 호출 된것을 알 수있다.

이유는 

    public Book(String title) {

        this(title, "작자미상");

        System.out.println("생성자 2호출됨");

    }

두번째 생성자 함수를 호출하면 this()함수를 이용하여 자기 자신을 또 호출하게 되는데, 이 때 

 this(title, "작자미상");

String매개변수를 두개 받으므로 이는 세번째 생성자 함수이다. 그래서 생성자3이 호출된 것이다.

 

밑에도 마찬가지.

 

+ Recent posts