2013-03-08 5 views
1

OpenCV의 매트 이미지가 cv::imencode을 base64 문자열로 사용하여 인코딩되는 응용 프로그램을 만들려고합니다. 이를 위해 vector<unsigned char>const unsigned char*으로 변환해야합니다.벡터 <부호없는 문자>를 const 부호없는 문자로 변환 *

어떻게하면됩니까?

vector<unsigned char> buffer; 

vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_PXM_BINARY); 
compression_params.push_back(0); 

if(!cv::imencode(".ppm", desc, buffer, compression_params)){ 
    printf("Image encoding failed"); 
} 

// This generates a error 
string output = base64_encode(buffer.data(), buffer.size()); 
printf("Output: %s", output.c_str()); 

은 내가 오류입니다 :

가 지금은 뭔가 잘못 어딘가 변환에서, 오류의 더 이상 생성하지 않습니다 EXC_BAD_ACCESS (code=1, address=0x2ffd7000)

업데이트; 출력은 그것을 디코딩 한 후 입력과 동일하지 않으며 대부분 A 문자로 구성됩니다. 이것은 현재 스크립트입니다

vector<unsigned char> buffer; 

vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_PXM_BINARY); 
compression_params.push_back(1); 

if(!cv::imencode(".pgm", desc, buffer, compression_params)){ 
    printf("Image encoding failed"); 
} 

string output = base64_encode(buffer.data(), buffer.size()); 
printf("Output: %s", output.c_str()); 

내 생각 엔 벡터 사이의 변환이 서명 숯불을에서 const 것입니다 때문에 다른 질문을해야한다고 생각하지 않습니다이 결과를 위로 놨어요; 이전에 base64_encode이 작동했습니다. 여기

const char* s = base64_encode(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.size()).c_str(); 

base64_encode funciton는 std::string을 반환 :

+1

'buffer.data로 변경해야에'(을 reinterpret_cast' ++ 11 컴파일러,'& buffer [0]') 할 수 있습니다. 또한 실제 오류 메시지를 게시하면 * 매우 도움이 될 것입니다. 그렇지 않으면 사람들은 문제가 무엇인지 추측하고 있습니다. – Cornstalks

+0

제거 할 때이 오류가 발생합니다 :'malloc : *** 객체 오류 0x41444967 : 해제 된 포인터가 할당되지 않았습니다. '그리고'& buffer [0]'을 사용하면'EXC_BAD_ACCESS (code = 1, address = 0x2ffd7000)' – tversteeg

+1

또한,'.c_str()'을하지 않을 것입니다 ... 그냥'string'에'string'을 할당하십시오. 'string64'가 반환 한'string64'의 메모리가 (일시적이기 때문에) 할당을하려고 할 때 해제 되었다면 놀라지 않을 것입니다. 적절한 이동 의미를 막기 때문에'.c_str()'을 호출하십시오.) – Cornstalks

답변

3

하나의 큰 문제입니다. 그런 다음 c_str() 메서드를 호출하면 기본 버퍼에 대한 포인터가 반환됩니다. 그러나 std::string은 즉시 범위를 벗어나 매달려있는 포인터를 남깁니다.

또한 reinterpret_cast는 전혀 필요하지 않습니다. 매달린 포인터와 아무 관계가없는 매달린 포인터로 인해 정의되지 않은 동작을 실행 중입니다. 당신은 C를 사용하지 않을 경우

당신의``const를 서명 숯불의 *는`이미, 그래서 필요가 없습니다) (

std::string s = base64_encode(buffer.data(), buffer.size()); 
+0

'reinterpret_cast'를 제거하고 새로운'string' 변수를 만들었지 만 둘 다 작동하지 않았습니다. 나는 여전히 같은 오류가 발생합니다.그 후 압축 매개 변수를 2 진수로 변경했습니다. 이제 더 이상 오류가 발생하지 않지만 생성 된 문자열이 올바르지 않습니다. – tversteeg

+0

@ThomasVersteeg : 좋아, 'cv :: imencode (".pgm", desc, buffer, compression_params) 란 무엇인가? 문서를 볼 수 있습니까? 특히 어떻게 버퍼에 채워지는지 설명 할 수 있습니다. 또한 호출 전에 buffer.size()를 삽입하여 원하는 것을 확인할 수 있습니까? –

+0

다음은 cv :: imencode에 관한 문서입니다 : http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html 그리고 어디에서 buffer.size()를 사용해야합니까? – tversteeg

관련 문제