11

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

  1. cvSaveImage(...)のJPEG圧縮率とは
  2. cvSaveImage(...) を使用するときに圧縮率を渡すにはどうすればよいですか
4

4 に答える 4

27

現在、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) );

私はドキュメントを見つけることができませんでしたが、このコードを調べたときの印象は、int 値の配列を作成して 3 番目のパラメーターに渡すということです。

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」は182KB、「out2.jpg」は4,009KBでした。

Subversion リポジトリから入手できる最新のコードを使用できるとすれば、あなたは順調に進んでいるように見えます。

ところで、品質パラメータの範囲は 0 ~ 100 で、デフォルトは 95 です。

于 2009-05-04T00:09:32.513 に答える
1
  1. おそらく、ここのソースコードを調べてみると、これを見つけることができます: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  2. 関数はそのようなパラメーターを受け入れないため、できません。圧縮を制御したい場合、私が考えることができる最も簡単な方法は、最初に cvSaveImage() (または選択した別のロスレス形式) を使用して画像をビットマップとして保存し、次に別の画像ライブラリを使用して JPEG に変換することです。希望の圧縮率。
于 2009-04-29T06:32:37.377 に答える
1
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
于 2016-07-27T18:39:57.200 に答える