Pergunta

Eu estou usando OpenCV e salvando como jpeg usando a função cvSaveImage, mas eu sou incapaz de encontrar o fator de compressão Jpeg usado por este.

  1. O que há de cvSaveImage (...) 's fator Jpeg Compression
  2. Como posso passar o fator de compressão ao usar cvSaveImage (...)
Foi útil?

Solução

Atualmente cvSaveImage () é declarado para ter apenas dois parâmetros:

int cvSaveImage( const char* filename, const CvArr* image );

No entanto, o " mais recente testado instantâneo " tem :

  #define CV_IMWRITE_JPEG_QUALITY 1
  #define CV_IMWRITE_PNG_COMPRESSION 16
  #define CV_IMWRITE_PXM_BINARY 32

  /* save image to file */
  CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,
                          const int* params CV_DEFAULT(0) );

eu fui incapaz de encontrar qualquer documentação, mas a minha impressão de que pica com este código é que você iria construir uma matriz de valores int para passar no terceiro parâmetro:

int p[3];
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = desired_quality_value;
p[2] = 0;

Eu não sei como o valor de qualidade é codificado, e eu nunca tentei isso, então caveat.emptor.

Editar:

Sendo um pouco curioso sobre isso, eu baixei e construiu a versão mais recente tronco de OpenCV, e foi capaz de confirmar o que precede via este bocado de descartável código:

#include "cv.h"
#include "highgui.h"
int main(int argc, char **argv)
{
    int p[3];
    IplImage *img = cvLoadImage("test.jpg");

    p[0] = CV_IMWRITE_JPEG_QUALITY;
    p[1] = 10;
    p[2] = 0;

    cvSaveImage("out1.jpg", img, p);

    p[0] = CV_IMWRITE_JPEG_QUALITY;
    p[1] = 100;
    p[2] = 0;

    cvSaveImage("out2.jpg", img, p);

    exit(0);
}

Meu "test.jpg" foi 2.054 KB, o criado "out1.jpg" era 182 KB e "out2.jpg" foi 4.009 KB.

Parece que você deve estar em boa forma supondo que você pode usar o código mais recente disponível no repositório Subversion.

BTW, o intervalo para o parâmetro de qualidade é 0-100, o padrão é 95.

Outras dicas

OpenCV agora tem uma parâmetro para definir jpeg qualidade. Eu não sei exatamente quando isso foi introduzido, mas provavelmente em algum momento após 2.0.

const int JPEG_QUALITY = 80;

Mat src;
// put data in src

vector<int> params;
params.push_back(CV_IMWRITE_JPEG_QUALITY);
params.push_back(JPEG_QUALITY);

imwrite("filename.jpg", src, params);

Se você estiver usando C ++ 0x, você pode usar esta notação mais curta:

imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
  1. Você pode achar esta picando em torno do código fonte aqui: http: // opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. Você não pode, como a função não aceita tal parâmetro. Se você quiser controlar a compressão, em seguida, o método mais simples que posso pensar é primeiro salvar sua imagem como um bitmap com cvSaveImage () (ou outro formato lossless de sua escolha) e, em seguida, usar outra biblioteca de imagens para convertê-lo em um JPEG do factor de compressão pretendido.
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg será a saída nome do arquivo
  • imagem de origem ser src leitura que contém variável
  • (vector<int>) typecasting
  • {CV_IMWRITE_JPEG_QUALITY, 20} uma matriz de elementos a serem passados ??como Param_ID - e Param_value em função imwrite
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top