2013-02-06 3 views
11

나는 unsigned char* 버퍼에 jpeg 이미지의 데이터가 있습니다. 그 이미지를 C++과 opencv를 사용하여 표시하고 싶습니다. 내가하는 일 :opencv 버퍼에서 jpeg 이미지 읽기

Mat img(Size(640, 480), CV_8UC3, data); 
namedWindow("image", 1); 
imShow("image", img); 

나는 잡음이 넘친다.

데이터가 jpeg (헤더 포함)이기 때문에 그럴 것이라고 생각합니다. 이 작품 때문에 :

Mat imgbuf(Size(640, 480), CV_8UC3, data); 
Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR); 

하지만 GTK 2를 기반으로 highgui.h에서와 같이 내가 imdecode 기능을 사용할 수 없습니다, 내 프로젝트에서 내가 3

그래서 GTK를 사용하는 방법은 내가 할 수있는 버퍼 데이터를 표시 하시겠습니까? opencv에서 imdecode 이외의 jpeg 이미지를 디코딩하는 방법이 있습니까? Qt를 사용하여 opencv를 다시 빌드해야하는 것은 아닙니다 ...

다른 제안 사항이 있습니까? (리눅스를 사용)

+2

당신은 디코딩'libjpeg'를 사용할 수 없음과 함께 할 수? 문제가 무엇입니까? – mmgp

+0

@mmgp 내가 libjpeg을 다할 것입니다, 단지 내가 할 수 있다고 생각 다른 라이브러리를 포함하지 않고 같은 것을. – Matekk

+1

하면 opencv jpeg 이미지를로드하지 않습니다 'libjpeg '을 가지고 있지 않으므로 다른 라이브러리는 포함되어 있지 않습니다. – mmgp

답변

4

나는 '감압 세부 정보'아래 libjpeg API documentation에 설명 된 표준 절차를 사용하여 libjpeg을 사용하여 JPEG 이미지를 압축했다.

데이터를 압축 해제 한 후이를 사용하여 cv::Mat을 구성 할 수 있습니다. OpenCV가 BGR 형식을 사용하는 반면, 압축 해제 된 이미지는 RGB 형식이지만, CV_RGB2BGR 형식의 cvtColor() 작업이 필요합니다.

27

나는 인터넷에서이 질문에 대한 많은 반응을 보았는데, libjpeg를 직접 호출하고 OpenCV의 imread() 루틴을 우회해야한다고 말했습니다.

필수는 아닙니다. imdecode()를 사용하여 메모리에서 원시 이미지 버퍼를 디코딩 할 수 있습니다. 그것을하는 방법은 직관적이지 않으며, 이것을 처음 시도하는 사람들을 도울만큼 충분히 문서화되어 있지 않습니다.

당신이 당신의 원시 파일 데이터에 대한 포인터/크기가 (FREAD() 직접 등등 .JPG, .PNG,이 .tif 파일에서 ... 경우

IT있어
int nSize = ...  // Size of buffer 
uchar* pcBuffer = ... // Raw buffer data 


// Create a Size(1, nSize) Mat object of 8-bit, single-byte elements 
Mat rawData(1, nSize, CV_8UC1, (void*)pcBuffer); 

Mat decodedImage = imdecode(rawData /*, flags */); 
if (decodedImage.data == NULL) 
{ 
    // Error reading raw image data 
} 

!

희망이 미래에 누군가를 도와줍니다.

+0

그것은 누군가를 도왔습니다. 'nsize'대신 'size'를 사용 했으므로 생성자에서 직접 rawData를 초기화 할 수있었습니다. –