박민혀기
VisionCube - camera calibration test program(Color) 본문
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;
}
결과
'VisionCube' 카테고리의 다른 글
VisionCubeKart | Filter + 3Channel Classification | arrangement (0) | 2024.01.17 |
---|---|
라즈베리파이 제로 카메라에 따른 해상도 비교(22Pin) (0) | 2024.01.06 |
VisionCube | VisionKart Plan (0) | 2023.11.21 |
VisionCube UART Sample Source(on RPi4) (0) | 2023.11.16 |