OpenCVを使用しており、cvSaveImage関数を使用してjpegとして保存していますが、これで使用されているJpeg圧縮係数が見つかりません。
現在、cvSaveImage()は、次の2つのパラメーターのみを受け取るように宣言されています。
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) );
ドキュメントを見つけることができませんでしたが、このコードを調べてみたところ、3番目のパラメーターに渡す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」は2,054KB、作成された「out1.jpg」は182 KB、「out2.jpg」は4,009KBでした。
Subversionリポジトリから入手できる最新のコードを使用できると仮定すると、良好な状態になっているはずです。
ところで、品質パラメータの範囲は0〜100で、デフォルトは95です。
OpenCV now パラメータがあります 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});
imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20});
filename.jpeg
が出力されますファイル名src
変数を含むソース画像の読み取り(vector<int>)
型キャスト{CV_IMWRITE_JPEG_QUALITY, 20}
Param_IDとして渡される要素の配列-およびimwrite関数のParam_value