2012-04-17 8 views
1

그래서 웹 페이지 API를 사용하여 이미지를 인코딩하려고합니다. 지금은 이미지를 열고 조작하기 위해 openCV를 사용하려고합니다. 그런 다음 webc로 저장하려고합니다. 내가 이것을 실행하면WebP 인코딩 - 분할 오류

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <cv.h> 
#include <highgui.h> 
#include <webp/encode.h> 

int main(int argc, char *argv[]) 
{ 

    IplImage* img = 0; 
    int height,width,step,channels; 
    uchar *data; 
    int i,j,k; 
    if (argc<2) { 
     printf("Usage:main <image-file-name>\n\7"); 
    exit(0); 
    } 
    // load an image 
    img=cvLoadImage(argv[1]); 

    if(!img){ 
     printf("could not load image file: %s\n",argv[1]); 
     exit(0); 
    } 

    // get the image data 
    height  = img->height; 
    width  = img->width; 
    step  = img->widthStep; 
    channels = img->nChannels; 
    data  = (uchar *)img->imageData; 
    printf("processing a %dx%d image with %d channels \n", width, height, channels); 

    // create a window 
    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("mainWin",100,100); 

    // invert the image 
    for (i=0;i<height;i++) { 
     for (j=0;j<width;j++) { 
      for (k=0;k<channels;k++) { 
       data[i*step+j*channels+k] = 255-data[i*step+j*channels+k]; 
      } 
     } 
    } 

    // show the image 
    cvShowImage("mainWin", img); 

    // wait for a key 
    cvWaitKey(0); 
    // release the image 
    cvReleaseImage(&img); 

    float qualityFactor = .9; 
    uint8_t** output; 
    FILE *opFile; 
    size_t datasize; 
    printf("encoding image\n"); 
    datasize = WebPEncodeRGB((uint8_t*)data,width,height,step,qualityFactor,output); 

    printf("writing file out\n"); 
    opFile=fopen("output.webp","w"); 
    fwrite(output,1,(int)datasize,opFile); 
} 

, 나는이 얻을 :

[email protected]:~/webp/webp_test$ ./helloWorld ~/Pictures/mars_sunrise.jpg 
processing a 2486x1914 image with 3 channels 
encoding image 
Segmentation fault 

그냥 좋은 이미지를 표시하지만 인코딩에 세그먼테이션 폴트 (segfault) 여기에 내가 사용하고 소스입니다. 내 초기 추측은 데이터를 작성하기 전에 img를 릴리스했기 때문에 인코딩을 시도하기 전이나 후에 릴리스할지 여부는 중요하지 않은 것 같습니다. 이 문제를 일으킬만한 다른 것이 있습니까? 이미지 데이터 등을 복사해야합니까?

WebP API 문서는 ... 희소식입니다.

The main encoding functions are available in the header src/webp/encode.h 
The ready-to-use ones are: 

size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, 
    int stride, float quality_factor, uint8_t** output); 

워드 프로세서는 특히 '보폭'이 무엇인지 말을하지 않습니다,하지만 난 그것을 OpenCV의에서 '스텝'과 동일하다고 가정하고있어 다음은 README가 WebPEncodeRGB에 대한 말씀입니다. 그게 합리적입니까?

미리 감사드립니다.

답변

0

는 그렇게 보인다 .

1

인코딩의 이미지 데이터에 대한 포인터를 사용하기 전에 cvReleaseImage으로 이미지를 릴리스합니다. 아마도 해제 함수가 이미지 버퍼를 해제하고 이제 data 포인터가 더 이상 유효한 메모리를 가리 키지 않습니다.

이 segfault의 원인이 될 수 있습니다.

// load an image 
img=cvLoadImage(argv[1]); 

함수 cvLoadImage가 추가 매개 변수

cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR) 

를 받아 내가

img=cvLoadImage(argv[1],1); 

로 변경시는 segfault 멀리 갔다 : 문제가 여기처럼

+0

+1 정확히 게시하려고했던 것입니다. – karlphillip

+0

필자의 글에서 지적했듯이 "필자가 데이터를 작성하기 전에 img를 릴리스했기 때문에 처음에는 인코딩을 시도하기 전이나 후에 릴리스할지 여부가 중요하지 않았다. . " 나는 encode 후에 'release'를 움직이려고 시도했지만 정확히 같은 결과를 얻는다. –

5

먼저 나중에 사용하면 이미지를 놓지 마십시오. 둘째, 출력 인수가 초기화되지 않은 주소를 가리키고 있습니다. 출력 주소에 대해 초기화 된 메모리를 사용하는 방법입니다.