سؤال

أنا باستخدام بنسف وحفظها كملف jpeg باستخدام cvSaveImage وظيفة, ولكن أنا غير قادر على العثور على ضغط Jpeg عامل المستخدمة من قبل هذا.

  1. ما cvSaveImage(...)'s عامل ضغط 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 p[3];
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = desired_quality_value;
p[2] = 0;

أنا لا أعرف كم قيمة الجودة هو ترميز و لم أجرب هذا ، لذلك التحذير emptor.

تحرير:

يجري قليلا غريبة عن هذا ، لقد حملت وبنى أحدث الجذع نسخة من بنسف ، وكانت قادرة على تأكيد ما سبق عبر هذا قليلا من بخس كود:

#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 كيلوبايت ، خلق "out1.jpg" كان 182 KB و "out2.jpg" كان 4,009 KB.

يبدو أنك يجب أن تكون في حالة جيدة على افتراض انك يمكن استخدام أحدث رمز المتاحة من التخريب مستودع.

راجع للشغل, مجموعة الجودة المعلمة 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} مجموعة من العناصر التي يمكن تمريرها Param_ID و Param_value في imwrite وظيفة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top