openCV C++ API를 사용하고 있으며 카메라 버퍼 (YUV_NV12)를 RGB 형식으로 변환하려고합니다. 그러나 내 이미지의 크기가 변경되어 (너비가 720에서 480으로 축소됨) 색이 잘못되었습니다 (다소 보라색/녹색).OpenCV cvtColor() 내 이미지 크기를 변경하고 색상이 잘못되었습니다.
unsigned char* myYUVBufferPointer = (something passed as argument)
int myYUVBufferHeight = 1280
int myYUVBufferWidth = 720
cv::Mat yuvMat(myYUVBufferHeight, myYUVBufferWidth, CV_8U, myYUVBufferPointer);
cv::Mat rgbMat;
cv::cvtColor(yuvMat, rgbMat, CV_YUV2RGB_NV12);
cv::imwrite("path/to/my/image.jpg",rgbMat);
아이디어가 있으십니까? * (CV_YUV2GRAY_NV12로 변환하고 크기가 맞지 않기 때문에 색상보다 크기가 더 중요합니다.) *
감사합니다. 꿀벌! CV_8UC3을 시도하면 0x11d7ba8에서 cvtColor() __generic_memcpy()를 호출 할 때 segfault가 발생합니다. 그래서 당신은 내 버퍼의 모든 픽셀을 반복해야하고 새로운 3 단일 채널을 구성해야한다고 말했습니까? RGB 대신 BGR을 사용해야하는 이유는 무엇입니까? – nox
참고 : cvtColor()를 호출 할 때 충돌이 발생합니다 (또는 imwrite()를 호출 할 때) – nox
OpenCV에서 CV_8U3C 이미지의 기본 색상 순서는 Blue-Green-Red입니다. 예를 들어,'cv :: imwrite()'는 컬러 이미지의 BGR 순서를 요구합니다. segfault는 여러 가지 이유로 발생할 수 있으므로 segfault를 얻는 이유를 파악하는 것은 매우 어렵습니다. 때로는 릴리스 프로그램에서 디버그 라이브러리를 사용하거나 그 반대의 경우가 원인입니다. 가장 좋은 방법은 CV_8U를 사용하여 각 채널을 따로 구축하고 각 채널을 std :: vector에 넣고 cv :: merge를 사용하여 벡터를 단일 CV_8UC3 이미지로 병합하는 것입니다. –
Bee