2009-04-29 19 views

cevap

27

Şu cvSaveImage() yalnızca iki parametre alması bildirildi:

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

Ancak, "latest tested snapshot" vardır

: Herhangi bir belge bulamadı oldum

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

, ancak bu kodun içine girdiğim izlenim, üçüncü parametrede geçmek için bir dizi int değeri oluşturacağınızdır:

int p[3]; 
p[0] = CV_IMWRITE_JPEG_QUALITY; 
p[1] = desired_quality_value; 
p[2] = 0; 

Kalite değerinin nasıl kodlandığını bilmiyorum ve bunu hiç denemedim, bu yüzden uyarı emri.

Düzenleme:

bu konuda biraz meraklı olmak, indirilen ve OpenCV en son gövde sürümünü inşa ve ıskarta bu kod bit yoluyla yukarıdaki onaylamak başardı:

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

Benim "test.jpg", 2.054 KB oldu, oluşturulan "out1.jpg" 182 KB ve "out2.jpg" 4,009 KB oldu.

Subversion deposundan edinebileceğiniz en son kodu kullanabileceğinizi kabul ederek iyi durumda olmanız gerektiği anlaşılıyor.

BTW, kalite parametresi için aralığı 0-100, varsayılan 95.

+0

nokta, teşekkürler! –

+0

Görüntü kalitesini düşürür ve görüntüyü gerçekten deforme eder. Lütfen, görüntü kalitesini bozmadan dosya boyutunu küçülten herhangi bir çözüm önerisinde bulunun. – AnkitRox

1
  1. cvSaveImage (...) kullanırken sıkıştırma faktörü geçebilir nasıl cvSaveImage (...) 'ın Jpeg sıkıştırma faktörü
  2. neler var Buradaki kaynak kodunun etrafına dolan: http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/
  3. Bu tür bir işlev kabul edilmediğinden, yapamazsınız. Sıkıştırmayı kontrol etmek istiyorsanız, aklınıza gelebilecek en basit yöntem ilk önce cvSaveImage() (veya seçtiğiniz başka bir kayıpsız biçim) ile görüntüyü bir bitmap olarak kaydeder ve daha sonra JPEG’in JPEG’ine dönüştürmek için başka bir görüntü kütüphanesi kullanır. istenen sıkıştırma faktörü.
5

OpenCV şimdi jpeg kalitesini ayarlamak için has a parameter olduğunu. Bunun ne zaman yapıldığına tam olarak emin değilim, ama muhtemelen 2.0'dan sonra.

  • src olmak kaynak resim içeren okumak çıktı dosya adı olacak

    imwrite("filename.jpg", src, vector<int>({CV_IMWRITE_JPEG_QUALITY, JPEG_QUALITY}); 
    
  • 0
    imwrite("filename.jpeg",src,(vector<int>){CV_IMWRITE_JPEG_QUALITY, 20}); 
    
    • filename.jpeg: C++ 0x kullanıyorsanız

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

      , bu kısa biçimi kullanabilirsiniz değişken

    • (vector<int>) typecasting
    • {CV_IMWRITE_JPEG_QUALITY, 20} elemanlı bir dizi Param_ID olarak geçirilecek - ve Param_value imwrite fonksiyonunda adam