OpenCV 2.3.1을 사용하여 12 비트 바이어 이미지를 8 비트 RGB 이미지로 변환하려고합니다. 그것은 cvCvtColor 기능을 사용하여 매우 간단합니다 같은이 보이지만, 함수는이 코드로 호출 예외가 발생합니다 :OpenCV를 사용하여 12 비트 바이어 이미지를 8 비트 RGB로 변환
int cvType = CV_MAKETYPE(CV_16U, 1);
cv::Mat bayerSource(height, width, cvType, sourceBuffer);
cv::Mat rgbDest(height, width, CV_8UC3);
cvCvtColor(&bayerSource, &rgbDest, CV_BayerBG2RGB);
내가 입력 데이터 이후, sourceBuffer의 끝을지나 실행 된 생각을 OpenCV에는 12 비트 유형이 없기 때문에 12 비트이고 16 비트 유형을 전달해야했습니다. 그래서 너비와 높이를 2로 나누었지만 cvCvtColor는 여전히 유용한 정보가없는 예외를 던졌습니다 (오류 메시지는 "알 수없는 예외"였습니다).
몇 달 전에 게시 된 similar question은 답변이 없었지만, 제 질문은 12 비트 바이엘 데이터를보다 구체적으로 다루기 때문에 새로운 질문을 제시하는 데 충분하다고 생각했습니다.
미리 감사드립니다.
cv::Mat srcMat(100, 100, CV_8UC3);
const cv::Scalar val(255,0,0);
srcMat.setTo(val);
cv::Mat destMat(100, 100, CV_8UC3);
cvCvtColor(&srcMat, &destMat, CV_RGB2BGR);
그래서 그것이 내가 * 뭔가를 잃어버린 * 밝혀 :
수정 Gillfish의 코드는 (카메라를 가정하고 16 비트 바이엘 인코딩 이미지를 제공합니다). 동료는 C 및 C++ 호출을 혼합한다고 지적했습니다. 마지막 줄을 으로 변경하십시오. cv :: cvtColor (srcMat, destMat, CV_RGB2BGR); 모든 것이 매력처럼 작동합니다. 나는 여전히 16 비트 바이어스 데이터를 8 비트 RGB 데이터로 변환한다는 원래의 문제에 대해 연구 중이므로 이에 대한 답을 찾으면 업데이트를 게시 할 것입니다. – Gillfish
'cvCvtColor'는 오래된 C OpenCV API에 속하지만'cv :: Mat'은 C++ API의 클래스입니다. 그것들을 혼합하는 것은 좋은 생각이 아니므로 한 가지 버전의 API 만 사용하는 것이 좋습니다. 'cv :: cvtColor (srcMat, dstMat, COLOR_RGB2BGR)'가 잘 동작 할 것입니다. –
"녹색 필터 모양"은 아마도 잘못된 바이어 패턴을 지정했음을 의미합니다. 모두 시도해보십시오. – user3443369