美文网首页Opencv C++ | Python
Opencv读取图片 C++ | Python

Opencv读取图片 C++ | Python

作者: vselfdom | 来源:发表于2020-08-08 11:26 被阅读0次

    1.0 Python读取图片

    import cv2
    import sys,os
    
    os.chdir(sys.path[0])                   #切换到当前路径
    
    if __name__ =='__main__':
        img_path = "./img/test.jpg"         #定义图片的相对路径
        img = cv2.imread(img_path)          #读入图片
        cv2.imshow("img",img)               #显示图片
        cv2.waitKey(-1)                     #等待按键 不然显示不出来
    

    2.0 C++读取图片

    #include <iostream>
    #include <opencv2\opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        string img_path = "./img/test.jpg";     //定义图片的相对路径
        Mat img = imread(img_path);             //读取图片
        imshow("img", img);                     //显示图片
        waitKey(-1);                            //等待按键 不然会一闪而过
        return 0;
    }
    

    3.0 运行结果

    Python结果显示 C++结果显示

    4.0 源码展示

    Mat imread( const String& filename, int flags )

    /**
     * Read an image
     *
     *  This function merely calls the actual implementation above and returns itself.
     *
     * @param[in] filename File to load
     * @param[in] flags Flags you wish to set.
    */
    Mat imread( const String& filename, int flags )
    {
        CV_TRACE_FUNCTION();
    
        /// create the basic container
        Mat img;
    
        /// load the data
        imread_( filename, flags, img );
    
        /// optionally rotate the data if EXIF' orientation flag says so
        if( !img.empty() && (flags & IMREAD_IGNORE_ORIENTATION) == 0 && flags != IMREAD_UNCHANGED )
        {
            ApplyExifOrientation(filename, img);
        }
    
        /// return a reference to the data
        return img;
    }
    

    static bool imread_( const String& filename, int flags, Mat& mat )

    /**
     * Read an image into memory and return the information
     *
     * @param[in] filename File to load
     * @param[in] flags Flags
     * @param[in] hdrtype { LOAD_CVMAT=0,
     *                      LOAD_IMAGE=1,
     *                      LOAD_MAT=2
     *                    }
     * @param[in] mat Reference to C++ Mat object (If LOAD_MAT)
     *
    */
    static bool
    imread_( const String& filename, int flags, Mat& mat )
    {
        /// Search for the relevant decoder to handle the imagery
        ImageDecoder decoder;
    
    #ifdef HAVE_GDAL
        if(flags != IMREAD_UNCHANGED && (flags & IMREAD_LOAD_GDAL) == IMREAD_LOAD_GDAL ){
            decoder = GdalDecoder().newDecoder();
        }else{
    #endif
            decoder = findDecoder( filename );
    #ifdef HAVE_GDAL
        }
    #endif
    
        /// if no decoder was found, return nothing.
        if( !decoder ){
            return 0;
        }
    
        int scale_denom = 1;
        if( flags > IMREAD_LOAD_GDAL )
        {
        if( flags & IMREAD_REDUCED_GRAYSCALE_2 )
            scale_denom = 2;
        else if( flags & IMREAD_REDUCED_GRAYSCALE_4 )
            scale_denom = 4;
        else if( flags & IMREAD_REDUCED_GRAYSCALE_8 )
            scale_denom = 8;
        }
    
        /// set the scale_denom in the driver
        decoder->setScale( scale_denom );
    
        /// set the filename in the driver
        decoder->setSource( filename );
    
        try
        {
            // read the header to make sure it succeeds
            if( !decoder->readHeader() )
                return 0;
        }
        catch (const cv::Exception& e)
        {
            std::cerr << "imread_('" << filename << "'): can't read header: " << e.what() << std::endl << std::flush;
            return 0;
        }
        catch (...)
        {
            std::cerr << "imread_('" << filename << "'): can't read header: unknown exception" << std::endl << std::flush;
            return 0;
        }
    
    
        // established the required input image size
        Size size = validateInputImageSize(Size(decoder->width(), decoder->height()));
    
        // grab the decoded type
        int type = decoder->type();
        if( (flags & IMREAD_LOAD_GDAL) != IMREAD_LOAD_GDAL && flags != IMREAD_UNCHANGED )
        {
            if( (flags & IMREAD_ANYDEPTH) == 0 )
                type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));
    
            if( (flags & IMREAD_COLOR) != 0 ||
               ((flags & IMREAD_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) )
                type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);
            else
                type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);
        }
    
        mat.create( size.height, size.width, type );
    
        // read the image data
        bool success = false;
        try
        {
            if (decoder->readData(mat))
                success = true;
        }
        catch (const cv::Exception& e)
        {
            std::cerr << "imread_('" << filename << "'): can't read data: " << e.what() << std::endl << std::flush;
        }
        catch (...)
        {
            std::cerr << "imread_('" << filename << "'): can't read data: unknown exception" << std::endl << std::flush;
        }
        if (!success)
        {
            mat.release();
            return false;
        }
    
        if( decoder->setScale( scale_denom ) > 1 ) // if decoder is JpegDecoder then decoder->setScale always returns 1
        {
            resize( mat, mat, Size( size.width / scale_denom, size.height / scale_denom ), 0, 0, INTER_LINEAR_EXACT);
        }
    
        return true;
    }
    
    

    5.0 往期回顾

    相关文章

      网友评论

        本文标题:Opencv读取图片 C++ | Python

        本文链接:https://www.haomeiwen.com/subject/crocdktx.html