web-dev-qa-db-ja.com

OpenCV cvSaveImageJpeg圧縮率

OpenCVを使用しており、cvSaveImage関数を使用してjpegとして保存していますが、これで使用されているJpeg圧縮係数が見つかりません。

  1. CvSaveImage(...)のJpeg圧縮率とは
  2. CvSaveImage(...)を使用するときに圧縮係数を渡すにはどうすればよいですか?
11
The Unknown

現在、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です。

26

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});
6
Rick Smith
  1. これはおそらく、ここのソースコードをざっと見てみるとわかります: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 関数はそのようなパラメータを受け入れないため、できません。圧縮を制御したい場合、私が考えることができる最も簡単な方法は、最初にcvSaveImage()(または選択した別のロスレス形式)で画像をビットマップとして保存し、次に別の画像ライブラリを使用してそれをJPEGに変換することです。必要な圧縮率。
1
Hannes Ovrén
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