मुझे 4.1 MB/s @50fps 1280x720 bgr8 दिखाई देता है।

.....और 3.7 एमबी/सेकेंड @50fps 1280x720 mono8.

मैं ग्रेस्केल के लिए लगभग 3 गुना कम बैंडविड्थ खपत की उम्मीद कर रहा था।

मैंने अपने प्रश्न को सरल बनाने और इसे और अधिक प्रत्यक्ष बनाने के लिए पूरी तरह से संपादित किया। नीचे मेरा सरल सी ++ प्रोग्राम और उसका आउटपुट है, यह मेरे निष्कर्षों को पुन: पेश कर सकता है। lenna.png

#include <iostream>
#include <vector>
#include <opencv2/imgproc/imgproc.hpp>    // gray
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    Mat im, imGray;
    im = imread( "lenna.png", IMREAD_COLOR ); // Read the file
    imGray = imread( "lenna.png", IMREAD_GRAYSCALE ); // Read the file
    if( im.empty() )                      // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    if(true){
        std::vector<int> params;
        params.resize(9, 0);
        params[0] = cv::IMWRITE_JPEG_QUALITY;
        params[1] = 80;
        params[2] = cv::IMWRITE_JPEG_PROGRESSIVE;
        params[3] = 0;
        params[4] = cv::IMWRITE_JPEG_OPTIMIZE;
        params[5] = 0;
        params[6] = cv::IMWRITE_JPEG_RST_INTERVAL;
        params[7] = 0;

        std::vector< uchar > buffer, bufferGray;

        if (cv::imencode(".jpeg", im, buffer, params))
          {

            float cRatio = (float)(im.rows * im.cols * im.elemSize())
                / (float)buffer.size();
            printf("BGR8 Jpeg image size: %lu KB,  Compression Ratio: 1:%.2f\n", buffer.size()/1024, cRatio);
          }
          else
          {
            printf("cv::imencode (jpeg) failed on bgr8 image\n");
          }


        if (cv::imencode(".jpeg", imGray, bufferGray, params))
          {

            float cRatio = (float)(imGray.rows * imGray.cols * imGray.elemSize())
                / (float)bufferGray.size();
            printf("MONO8 Jpeg image size: %lu KB,  Compression Ratio: 1:%.2f\n\n", bufferGray.size()/1024, cRatio);
        
          }
          else
          {
            printf("cv::imencode (jpeg) failed on mono8 image\n");
          }
      }
  
    imshow( "BGR8", im );
    imshow( "MONO8", imGray );
    waitKey(0);
   return 0;
}

g++ -g -O3 main.cpp -o main pkg-config --libs --cflags opencv4

आउटपुट: यहां छवि विवरण दर्ज करें मेरी चिंता ग्रे-स्केल के लिए कम संपीड़न अनुपात है।

नीचे मेरी कुछ सिस्टम जानकारी है:

jai@jai:~$ opencv_version
4.2.0
jai@jai:~$ opencv_version -v | grep jpeg
JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 80)
jai@jai:~$ ldconfig -p | grep jpeg
libmjpegutils-2.1.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libmjpegutils-2.1.so.0
libjpegxr.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libjpegxr.so.0
libjpeg.so.8 (libc6,x86-64) => /lib/x86_64-linux-gnu/libjpeg.so.8
libjpeg.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libjpeg.so
libgdcmjpeg16.so.3.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg16.so.3.0
libgdcmjpeg16.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg16.so
libgdcmjpeg12.so.3.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg12.so.3.0
libgdcmjpeg12.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg12.so
libgdcmjpeg8.so.3.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg8.so.3.0
libgdcmjpeg8.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libgdcmjpeg8.so
jai@jai:~$

मैंने opencv4, opencv3.4.0 और opencv3.4.9 पर जाँच की।

0
Jai 19 जुलाई 2020, 03:27

1 उत्तर

सबसे बढ़िया उत्तर

JPEG अपनी डिफ़ॉल्ट एन्कोडर सेटिंग में 4:2:0 करता है क्रोमा सबसैंपलिंग। तो यह धारणा कि एक रंगीन छवि बैंडविड्थ में ग्रेस्केल छवि से तीन गुना अधिक लेती है, गलत है। इसके बजाय, यह कारक 1,5 होना चाहिए। लेकिन इसके अतिरिक्त:

  1. दो क्रोमा चैनल इंटेंसिटी/ग्रीन चैनल (YCbCr कलर मॉडल) के सापेक्ष स्टोर किए जाते हैं। , जिसका अर्थ है कि उन्हें अधिक प्रभावी ढंग से संपीड़ित किया जा सकता है।
  2. आपको हमेशा हेडर, क्वांटिज़ेशन मैट्रिक्स इत्यादि स्टोर करने की आवश्यकता होती है ताकि बफर आकारों की तुलना करते समय विचार करने के लिए आपके पास आधार रेखा हो

अंत में, मैं कहूंगा कि 43kb बनाम 33kb काफी उचित दिखता है।

1
ypnos 19 जुलाई 2020, 20:38