Коэффициент сжатия OpenCV cvSaveImage Jpeg

Я использую OpenCV и сохраняю в формате jpeg с помощью функции cvSaveImage, но я не могу найти коэффициент сжатия Jpeg, используемый этим.

  1. Какой у cvSaveImage(...) коэффициент сжатия Jpeg
  2. Как передать коэффициент сжатия при использовании cvSaveImage(...)

person The Unknown    schedule 29.04.2009    source источник


Ответы (4)


В настоящее время объявлено, что cvSaveImage() принимает только два параметра:

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

Однако "последний протестированный снимок" содержит:

  #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) );

Мне не удалось найти какую-либо документацию, но после просмотра этого кода у меня сложилось впечатление, что вы должны построить массив значений int для передачи в третьем параметре:

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

Я не знаю, как кодируется значение качества, и я никогда не пробовал это, так что будьте осторожны.

Изменить:

Будучи немного любопытным, я загрузил и собрал последнюю версию OpenCV для магистрали и смог подтвердить вышеизложенное с помощью этого фрагмента одноразового кода:

#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);
}

Мой «test.jpg» весил 2054 КБ, созданный «out1.jpg» — 182 КБ, а «out2.jpg» — 4009 КБ.

Похоже, вы должны быть в хорошей форме, если можете использовать последний код, доступный в репозитории Subversion.

Кстати, диапазон параметра качества 0-100, по умолчанию 95.

person Lance Richardson    schedule 04.05.2009
comment
Это снижает качество изображения и действительно искажает изображение. Пожалуйста, предложите любое решение, которое уменьшит размер файла без искажения качества изображения. - person AnkitRox; 12.02.2015

OpenCV теперь имеет параметр для установки качества jpeg. Я не уверен точно, когда это было введено, но предположительно где-то после 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);

Если вы используете C++0x, вы можете использовать эту более короткую нотацию:

imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
person Rick Smith    schedule 15.04.2015

  1. Вероятно, вы можете найти это, покопавшись в исходном коде здесь: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. Нельзя, так как функция не принимает такой параметр. Если вы хотите контролировать сжатие, то самый простой способ, который я могу придумать, - это сначала сохранить ваше изображение в виде растрового изображения с помощью cvSaveImage() (или другого формата без потерь по вашему выбору), а затем использовать другую библиотеку изображений, чтобы преобразовать его в JPEG формата. желаемый коэффициент сжатия.
person Hannes Ovrén    schedule 29.04.2009

imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
  • filename.jpeg будет выводиться Имя файла
  • src быть прочитанным исходным изображением, содержащим переменную
  • (vector<int>) приведение типов
  • {CV_IMWRITE_JPEG_QUALITY, 20} массив элементов для передачи в качестве Param_ID и Param_value в функцию imwrite
person N PRABHU RAM prabhuramn4186ece    schedule 27.07.2016