質問

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

  1. cvSaveImage(...)のJpeg圧縮係数とは
  2. cvSaveImage(...)を使用するときに圧縮率を渡すにはどうすればよいですか
役に立ちましたか?

解決

現在、cvSaveImage()は2つのパラメーターのみを取るように宣言されています:

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

ただし、<!> quot; 最新のテスト済みスナップショット <!> quot;持っている:

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

私の<!> quot; test.jpg <!> quot;作成された<!> quot; out1.jpg <!> quot;は2,054 KBでした。 182 KBで<!> quot; out2.jpg <!> quot; 4,009 KBでした。

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});
  1. おそらく、次のソースコードを確認することでこれを見つけることができます。 http:// opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 関数はそのようなパラメータを受け入れないため、できません。圧縮を制御したい場合、私が考えることができる最も簡単な方法は、最初に画像を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として渡される要素の配列-imwrite関数のParam_value
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top