所以我試圖使用webp API來編碼圖像。現在我要使用openCV來打開和處理圖像,然後我想將它們保存爲webp。下面是我使用的源: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
它顯示的圖像只是罰款,而是在編碼段錯誤。我最初的猜測是,這是因爲我在嘗試寫出數據之前釋放了img,但在嘗試編碼之前或之後我釋放它似乎並不重要。有什麼我錯過了,可能會導致這個問題?我是否必須複製圖像數據或其他內容?
WebP api文檔是...稀疏。下面是自述說,關於WebPEncodeRGB:
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中的「一步」。這是否合理?
在此先感謝!
+1這正是我要發佈的內容。 – karlphillip 2012-04-17 18:28:49
正如我在我的文章中指出的,「我最初的猜測是,這是因爲我在嘗試寫出數據之前先釋放img,但在嘗試編碼之前或之後是否釋放它似乎並不重要「。 我試着將'release'移動到編碼之後,但我得到完全相同的結果。 – 2012-04-17 19:06:53