박민혀기

VisionCube - camera calibration test program(Color) 본문

VisionCube

VisionCube - camera calibration test program(Color)

박민혀기 2023. 11. 21. 09:50

1. Grayscale Calibration

GRB, HSV, YUV 사용 시 Color calibration이 필요하겠지만,

우선 Grayscale calibration에 대해서 밝기 값으로만 진행해 보았다.

 

Matrix

OpenCV에서 제공되는 Mat 클래스는 음수를 담을 수 없다.(출처 Chat GPT)

우선 Mat 클래스는 선언시 기본적으로 사이즈와 데이터 타입을 설정해준다.

Mat(Size(x, y), data type)

 

생각해보니 데이터 타입에 CV_16S 같은 16bit 정수를 표현하는 데이터 타입이 있다.

여기서 16은 비트수, S는 Signed(정수)를 뜻한다.(U는 Unsigned(양수))

 

이번 테스트에서는 Grayscale 이미지를 처리하기 때문에 아래처럼 선언 하였다.

Mat(Size(x, y), CV_16SC1)

(C1은 Channel이 하나, 즉  흑백으로 선언)


.at<Data Type>

처음에는 두 프레임의 차를 구하는 것이었다. (카메라 두 대를 사용)

두 프레임의 차(절댓값X)를 나머지 한 프레임에 더해주면 된다고 생각 했는데 원하는 결과를 얻지 못했다.

출력된 이미지를 자세히 살펴보니 픽셀의 값이 0이하로 내려가지 않는 것이었다.

 

위에 Matrix 부분 설명처럼 Mat 클래스는 CV_8U가 기본값으로 설정 되어있다.

따라서 음수값은 Mat 클래스에 담을 수 없다.(음수는 0으로 처리)

Mat 선언시 CV_16SC1으로 설정(범위 : -255 ~ 255)

 

처음엔 아래와 같은 방법으로 진행 하였는데 음수 값이 적용되지 않았다.

Mat Subframe = frame1 = frame2;

 

그래서 생각한 방법이 픽셀 접근(at함수)

OpenCV에서 하나하나의 픽셀 값을 접근하거나 처리하게 될 경우 at을 많이 사용하게 된다.

(개인적으로 at이 가장 편함 물론 한 행씩 불러오는 다른 접근 함수도 존재함)

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
       	 frame1.at<short>(j, i) = 원하는 값;
        }
    }

단순히 픽셀 하나하나 접근하는 프로그램이지만 까다로웠던 부분은 Data Type<short>부분이다.

보통은 unsigned int, unsigned char 정도 사용하지만 음수(-255 ~ 255)를 처리해야 하기 때문에 short로 설정해 두었다.

 

전체 소스코드

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

using namespace std;
using namespace cv;

int main(){
        int wh = 23;

        Mat frame1 = Mat::ones(wh, wh, CV_16SC1);

        int cnt = -256;
        for(int i = 0; i < wh; i++){
                for(int j = 0; j < wh; j++){
                        frame1.at<short>(j, i) = cnt;
                        cnt++;
                }
        }

        cout << frame1 << endl;
        return 0;
}

결과

-255 ~ 255 사이의 값들이  정상적으로 처리된 것을 확인할 수 있다.