Framework/OpenCV

[OpenCV] C++ Mat 채널 변경 (permute, transpose)

깜태 2021. 12. 8. 13:44
728x90

딥러닝은 보통 파이썬에서 TensorFlow나 PyTorch 라이브러리를 이용해 진행된다. 

파이썬에서는 [B, C, H, W] 같은 형태로 결과물이 나오게 되지만,

OpenCV  C++에서는 [H, W, C] 의 형태를 지닌다.

 

 

그림에서 위는 OpenCV에서 픽셀을 인식하는 방법, 아래는 딥러닝에서의 결과로 어떻게 다른지 볼 수 있다. 

 

C++에서 딥러닝 기반의 영상처리를 진행하다 보면

[B, C, H, W] 형태의 결과를 C++ OpenCV 형식 [H, W, C]에 맞게 변경이 필요할 때도 있다.

 

배치 사이즈는 1이라는 가정 하에서, 채널을 변경하는 방법은 아래와 같다.

model_result 라는 포인터가 모델 아웃풋을 가리키고 있다는 가정 하에 채널 덩어리를 한채널씩으로 합치면 된다.

float* model_result = output_tensors.front().GetTensorMutableData<float>();

cv::Mat result_mat;
Mat channelR(height_, width_, CV_32FC1, model_result);
Mat channelG(height_, width_, CV_32FC1, model_result + height_ * width_);
Mat channelB(height_, width_, CV_32FC1, model_result + 2 * height_ * width_);
std::vector<Mat> channels{ channelR, channelG, channelB };
merge(channels, result_mat);

 

참고

 

https://stackoverflow.com/questions/43183931/opencv-create-3-channel-mat-from-continuous-data-array

728x90