1

そのため、webpAPIを使用して画像をエンコードしようとしています。今はopenCVを使用して画像を開いて操作します。次に、それらを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);
}

これを実行すると、次のようになります。

nato@ubuntu:~/webp/webp_test$ ./helloWorld ~/Pictures/mars_sunrise.jpg 
processing a 2486x1914 image with 3 channels 
encoding image
Segmentation fault

画像は問題なく表示されますが、エンコーディングに問題があります。私の最初の推測では、データを書き出す前にimgをリリースしているためですが、エンコードを試す前にリリースするか、後にリリースするかは問題ではないようです。この問題を引き起こす可能性のある他の何かが欠けていますか?画像データなどのコピーを作成する必要がありますか?

WebPapiドキュメントは...まばらです。READMEが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の「ステップ」と同じであると想定しています。それは合理的ですか?

前もって感謝します!

4

3 に答える 3

5

まず、後で使用する場合は画像を解放しないでください。次に、出力引数が初期化されていないアドレスを指しています。これは、出力アドレスに初期化されたメモリを使用する方法です。

uint8_t* output;
datasize = WebPEncodeRGB((uint8_t*)data, width, height, step, qualityFactor, &output);
于 2012-12-05T11:56:01.083 に答える
1

cvReleaseImageエンコーディングに画像データへのポインタを使用する前に、で画像を解放します。おそらく、そのリリース機能によって画像バッファが解放され、dataポインタが有効なメモリをポイントしなくなります。

これがセグメンテーション違反の理由である可能性があります。

于 2012-04-17T18:27:28.183 に答える
0

問題はここにあったようです:

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

関数cvLoadImageは追加のパラメーターを取ります

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

そして私がに変わったとき

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

セグメンテーション違反はなくなりました。

于 2012-04-25T22:02:52.840 に答える