OpenCV cvSaveImage Коэффициент сжатия Jpeg
Вопрос
Я использую OpenCV и сохраняю в формате JPEG с помощью функции cvSaveImage, но не могу найти используемый при этом коэффициент сжатия Jpeg.
- Какой коэффициент сжатия Jpeg у cvSaveImage(...)
- Как передать коэффициент сжатия при использовании cvSaveImage(...)
Решение
В настоящее время объявлено, что 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.
Другие советы
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});
- Вероятно, вы можете найти это, покопавшись в исходном коде здесь: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
- Нельзя, так как функция не принимает такой параметр.Если вы хотите контролировать сжатие, то самый простой метод, который я могу придумать, — это сначала сохранить ваше изображение в виде растрового изображения с помощью cvSaveImage() (или другого формата без потерь по вашему выбору), а затем использовать другую библиотеку изображений, чтобы преобразовать его в JPEG изображения. желаемый коэффициент сжатия.
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