2017-03-20 12 views
0

이미지를 YUYV 형식에서 RGB24로 변환하는 데 cvtColor를 사용하고 있습니다. 색상은 문제가 없지만 이미지의 절반은 잘립니다. 이미지는 어떤 헤더도없는 640x480 YUYV 이미지 버퍼입니다.OpenCV cvtColor image truncated

FILE* fd = fopen("imgdump", "r+b"); 

char buffer[640*480*2]; // Each pixel takes two bytes in YUYV 

if (fd != NULL) 
{ 
    fread(buffer, sizeof(char), 640*480*2, fd); 
    fclose(fd); 
} 

Mat s_sImageMat = Mat(640, 480, CV_8UC2); 
Mat s_sConvertedImageMat; 

cout << "before conversion\n"; 
s_sImageMat.data = (uchar*) buffer; 
cvtColor(s_sImageMat, s_sConvertedImageMat, CV_YUV2RGB_YUYV); 
cout << "after conversion\n"; 

FILE* fw = fopen("converted", "w+b"); 

if (fw != NULL) 
{ 
    fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*2, fw); 
    fclose(fw); 
} 

Original Converted

원본 파일 : 나는 다음과 같은 코드를 사용하고 https://drive.google.com/file/d/0B0YG1rjiNkBUQ0ZuaWN6Y1E2LUU/view?usp=sharing

추가 정보 : 내가 OpenCV의 3.2

+1

's_sImageMat.data = (UCHAR *) 버퍼입니다'- 싸, 당신은하지 않고 버퍼를 교환하고 주인의 지식과 오래된 것을 새어 나왔어? 대신 적절한 ['cv :: Mat' 생성자] (http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a51615ebf17a64c968df0bf49b4de6a3a)를 사용하지 않으시겠습니까? –

+0

나는 그것이 변환에 영향을 미치지는 않을 것이라는 것을 알고 있지만, 이것은 메모리 누수의 원인이되는 것을하기위한 변명이 아니다. 이와 같은 코드를 작성하는 습관에 빠지지 마십시오. –

+0

어쨌든, 보여주는 코드에서 중요한 부분이 누락 된 것 같습니다. 이 문제를 재현 할 수있는 의견과 함께 전체 [MCVE] (https://stackoverflow.com/help/mcve)를 첨부 할 수 있습니까? –

답변

1

문제를 다음 줄에있는 것으로 보인다 사용하고 있습니다 :

fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*2, fw); 
,210

RGB24를 들어, BE해야한다 :

fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*3, fw); 

각 픽셀은 RGB24에서 3 바이트

+0

대단히 감사합니다. 효과가있어 문제가 해결되었습니다. –