Я использую OpenCV и сохраняю как jpeg, используя функцию cvSaveImage, но я не могу найти коэффициент сжатия Jpeg, используемый этим.
- Что cvSaveImage (...) Jpeg Коэффициент сжатия
- Как передать коэффициент сжатия при использовании cvSaveImage (...)
Я использую OpenCV и сохраняю как jpeg, используя функцию cvSaveImage, но я не могу найти коэффициент сжатия Jpeg, используемый этим.
В настоящее время объявлен 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;
Я не знаю, как кодируется значение качества, и я никогда не пробовал этого, поэтому предостерегаю emptor.
Edit:
Будучи немного любопытным, я загрузил и построил последнюю версию trunk версии 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" был 2,054 КБ, созданный "out1.jpg" был 182 КБ, а "out2.jpg" был 4,009 КБ.
Похоже, вы должны быть в хорошей форме, предполагая, что вы можете использовать последний код, доступный из репозитория Subversion.
BTW, диапазон для параметра качества 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);
Если вы используете С++ 0x, вы можете использовать это более короткое обозначение:
imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY});
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
filename.jpeg
будет выведено Имя файлаsrc
читать исходное изображение, содержащее переменную(vector<int>)
typecasting{CV_IMWRITE_JPEG_QUALITY, 20}
массив элементов, которые должны быть переданы как Param_ID - и Param_value в функции imwrite