문제

CVSaveImage 기능을 사용하여 OpenCV를 사용하고 JPEG로 저장하고 있지만 이에 사용되는 JPEG 압축 계수를 찾을 수 없습니다.

  1. cvsaveImage (...)의 JPEG 압축 계수는 무엇입니까?
  2. cvsaveImage를 사용할 때 압축 계수를 전달하려면 어떻게해야합니까 (...)
도움이 되었습니까?

해결책

현재 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;

나는 품질 값이 어떻게 인코딩되는지 모르겠다. 그리고 나는 이것을 시도한 적이 없다.

편집하다:

이것에 대해 약간 궁금해지면서, 나는 OpenCV의 최신 트렁크 버전을 다운로드하고 만들었고,이 비트의 throwaway 코드를 통해 위의 것을 확인할 수있었습니다.

#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 kb, 생성 된 "Out1.jpg"는 182kb이고 "out2.jpg"는 4,009 KB였습니다.

Subversion Repository에서 사용할 수있는 최신 코드를 사용할 수 있다고 가정하면 모양이 양호해야합니다.

BTW, 품질 매개 변수의 범위는 0-100이고 기본값은 95입니다.

다른 팁

지금 오펜브 매개 변수가 있습니다 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} imwrite 함수에서 param_id- 및 param_value로 전달되는 요소 배열
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top