OpenCV Mat实例详解 四

news2025/3/13 13:30:34

        OpenCV Mat实例详解三中详细介绍来了OpenCV Mat类的公有静态成员函数,下面介绍OpenCV Mat类的其他常用成员函数。

OpenCV Mat类常用成员函数

        Mat & adjustROI (int dtop, int dbottom, int dleft, int dright);

        dtop ROI 上边界移动值,如果为正,上边界向上移动,如果值为负,则向下移动。

        dbottom  ROI 下边界移动值,如果为正,下边界向下移动,如果值为负则向上移动。

        dleftm  ROI 左边界移动值,如果为正,左边界向左移动,如果值为负,则向右移动。

        dbottom  ROI 右边界移动值,如果为正,右边界向右移动,如果值为负,则向左移动。

        这是一个比较有用的函数,在机器视觉中作目标检测及尺寸量测时,在对ROI区域左动态调整时,会用到这个函数。

        下面来演示该函数的使用方法,新建一个空的控制台程序,在程序中加入如下代码:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    /*
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    waitKey(0);
    return 0;
}

试运行,结果如下:

我们感兴趣的是载入图片左下角的那颗IC,但取得ROI区域时,却取入了部分别的原件图像。这种情况下就需要用到adjustROI函数来调整ROI区域。下面将程序中注释掉的程序段的注释取消,让adjustROI函数起作用,注释去掉后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    
    waitKey(0);
    return 0;
}

     试运行,结果如下:

最下面 的图片即为调用adjustROI函数调整后的ROI区域,不再包含误选的元件。

void assignTo (Mat &m, int type=-1) const;

        它提供了一种Mat type 转换方法,如果type为-1.则不做type转换,这是矩阵表达式引擎调用的内部使用的方法。

        修改上面的示例代码,来演示该函数的使用,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    /*
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */

    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面的示例代码,修改后如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    //imshow("src", src);
 
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    waitKey(0);
    return 0;
}

试运行,结果如下:

        可以看出已实现src的type转换。虽然可实现type的转换,但是对于已有数据的Mat对象,这种转换可能导致原有数据没法使用及原有图像无法显示。

        at() 

    用以获取Mat对象数据矩阵某以元素的值或者给其赋值。其原型有以下几种形式;

template<typename _Tp >  _Tp &  at (int i0=0)

 template<typename _Tp >  _Tp &  at (int i0=0) const

template<typename _Tp >    _Tp &  at (int row, int col)

template<typename _Tp >   const _Tp &  at (int row, int col) const

template<typename _Tp >    _Tp & at (int i0, int i1, int i2)

template<typename _Tp >    const _Tp & at (int i0, int i1, int i2) const

template<typename _Tp >    _Tp & at (const int *idx)

template<typename _Tp >   const _Tp & at (const int *idx) const

template<typename _Tp >  _Tp &  at (const Vec< int, n > &idx) 

template<typename _Tp >  const _Tp &  at (const Vec< int, n > &idx) const 

template<typename _Tp >   _Tp &   at (Point pt)

template<typename _Tp >  const  _Tp &   at (Point pt) const

上面的at函数原型都有带const与不带const两种形式,二者的区别在于可接受的参数不同。

修改上面代码,来演示其应用,修改后得到代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
 
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改以上代码,修改后如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
 
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改以上代码,修改后如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    { 
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
 
    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);
    
    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }

    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面代码,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    Mat m = Mat(5, 5, CV_8UC1);
    int const length = m.cols * m.rows*m.channels();
    int mdata[25] = {};
    for (size_t i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    Mat m = Mat(5, 5, CV_8UC1);
    int const length = m.cols * m.rows*m.channels();
    Point mdata[25] = {};
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面代码,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    Mat m = Mat(5, 5, CV_8UC1);
    int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    Vec<int, 25> mdata;
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    
    
    waitKey(0);
    return 0;
}

 试运行,结果如下:

template<typename _Tp >  MatIterator_< _Tp >  begin ()

template<typename _Tp >  MatIterator_< _Tp >  begin () const

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    Mat m = Mat(5, 5, CV_8UC1);
    typedef Vec<uchar, 1> vec;
    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout << *it1_start;
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面代码,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    Mat m = Mat(5, 5, CV_8UC1);
    //typedef Vec<uchar, 1> vec;
    MatIterator_<uchar> it_start = m.begin<uchar>();
    MatIterator_<uchar> it_end = m.end<uchar>();

    MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    MatConstIterator_<uchar> it1_end = m.end<uchar>();
    int i = 0;
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<(int) *it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面代码,修改后的代码如下: 

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    waitKey(0);
    return 0;
}

试运行,结果如下: 

int channels () const

返回Mat对象数据矩阵的通道数,该函数以多次出现再前面的示例中,这里就不再做演示。

int  checkVector (int elemChannels, int depth=-1, bool requireContinuous=true) const

        elemChannels    矩阵应具有的通道数或列数。对于2-D矩阵,当矩阵只有1列时,它应该具有elemChannels通道;当矩阵只有1个通道时,它应该有elemChannels列。对于三维矩阵,它应该只有一个通道。此外,如果平面的数量不是一个,那么每个平面内的行数必须是1;如果每个平面内的行数不是1,则平面数必须是1。

        depth                   矩阵元素位深度,缺省位-1,对任意深度设置位-1是合适的。

        requireContinuous 如果设置位true,矩阵需是连续的。

        返回值  如果不满足需求条件返回-1,否则返回矩阵元素个数,注意元素可能有多个通道。

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    cout << src.checkVector(src.channels(), -1, true)<<endl;
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

CV_NODISCARD_STD Mat clone () const

返回一个克隆的Mat对象。

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

Mat  col (int x) const

为指定的Mat的对象创建矩阵列头,该方法为指定的矩阵生成一个新的头,这是一个O(1)运算,与矩阵大小无关,x无论输入多大(0~源的cols范围内),新生成的矩阵cols都为1。新矩阵的基础数据与原始矩阵共享。

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    Mat dst = src.col(5);
    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;

    
    waitKey(0);
    return 0;
}

试运行,结果如下:

再修改上面的示例代码,插入一行修改dst cols的代码,修改后的代码如下: 

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    Mat dst = src.col(5); 

    dst.cols = 100;
    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;

    
    waitKey(0);
    return 0;
}

试运行,结果如下: 

可以看出,当生成新Mat矩阵头后可以通过修改cols值,来调整新生成的Mat对象的矩阵数据范围。

Mat  colRange (int startcol, int endcol) const

Mat colRange (const Range &r) const

这两个函数与上一个函数的作用差不多,只不过是这两个一开始就指定cols范围。

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    //Mat dst = src.col(5); 

    Mat dst = src.colRange(5,150);
    Mat dst1 = src.colRange(Range(50,220));
    //dst.cols = 100;
    imshow("dst", dst);
    imshow("dst1", dst1);
    moveWindow("dst1", 0, 200);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;


    cout << " dst1 cols: " << dst1.cols << endl;
    cout << " dst1 rows: " << dst1.rows << endl;
    cout << " dst1 type: " << dst1.type() << endl;

    waitKey(0);
    return 0;
}

试运行,结果如下:  

用上面三个函数生成的Mat对象能否调用adjustROI函数来调整ROI区域呢?答案是肯定的。

void convertTo (OutputArray m, int rtype, double alpha=1, double beta=0) const

m 输出目标Mat 对象,如果其类型及大小不合适,将会被重新分配

alpha 像素BGR值比例缩放因子,可改变图像的明暗,不能缩改变图像大小,缺省为1

beta 添加到缩放因子的可选增量。

该方法将源像素值转换为目标数据类型。 saturate_cast<> 应用在末尾以避免可能的溢出,如下:

 修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

void  copySize (const Mat &m)

内部使用函数;正确地重新分配 _size、_step 数组

m 源Mat对象

 修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    //Mat dst = src.col(5); 

    Mat dst = src.colRange(5,150);
    Mat dst1 = src.colRange(Range(50,220));
    //dst.cols = 100;
    imshow("dst", dst);
    imshow("dst1", dst1);
    moveWindow("dst1", 0, 200);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;

    cout << " dst1 cols: " << dst1.cols << endl;
    cout << " dst1 rows: " << dst1.rows << endl;
    cout << " dst1 type: " << dst1.type() << endl;
    */
    
    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    src.convertTo(src, src.type(), 1.2, 0);
    imshow("src new", src);
    */
    
    Mat src = Mat(5, 5, CV_8UC1);
    cout << src.size() << endl;

    Mat dst = Mat(8, 8, CV_8UC3);
    
    src.copySize(dst);
    cout << src.size() << endl;
    
   
    waitKey(0);
    return 0;
}

 试运行,结果如下:

void copyTo (OutputArray m) const

void  copyTo (OutputArray m, InputArray mask) const

拷贝到另一个Mat对象

m 目标Mat对象

mask 与 *this 大小相同的操作掩码。它的非零元素表示哪些矩阵元素需要复制。掩码必须为 CV_8U 类型,并且可以有 1 个或多个通道。

 修改上面的示例代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    /*
    Mat src = imread("1.bmp");
    if(src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    //Mat dst = src.col(5); 

    Mat dst = src.colRange(5,150);
    Mat dst1 = src.colRange(Range(50,220));
    //dst.cols = 100;
    imshow("dst", dst);
    imshow("dst1", dst1);
    moveWindow("dst1", 0, 200);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;

    cout << " dst1 cols: " << dst1.cols << endl;
    cout << " dst1 rows: " << dst1.rows << endl;
    cout << " dst1 type: " << dst1.type() << endl;
    */
    
    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    src.convertTo(src, src.type(), 1.2, 0);
    imshow("src new", src);
    */
    
    /*
    Mat src = Mat(5, 5, CV_8UC1);
    cout << src.size() << endl;

    Mat dst = Mat(8, 8, CV_8UC3);
    
    src.copySize(dst);
    cout << src.size() << endl;
    */
   
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    Mat dst;
    src.copyTo(dst);
    imshow("dst", dst);

    Mat mask(src.size(), CV_8UC1, cv::Scalar(255));
    mask(Rect(0, 0, src.cols/2, src.rows / 2)) = Scalar(0);

    Mat dst1(src.size(), src.type());
    src.copyTo(dst1, mask);
    imshow("dst1", dst1);

    waitKey(0);
    return 0;
}

试运行,结果如下:

void create (int rows, int cols, int type)

void  create (Size size, int type)

void create (int ndims, const int *sizes, int type)

void  create (const std::vector< int > &sizes, int type)

以上四个函数都是用以生成新的Mat对象,差别仅是接受的参数不同。

rows 新Mat对象的rows

cols 新Mat对象的cols

type 新Mat兑现的type

size 含新Mat对象rows、cols的vector对象

修改上面的示例代码,来演示该函数的用法,修改后的代码如下:


        return -1;
    }
    imshow("src", src);

    cout << "src cols: "<<src.cols << endl;
    cout << "src rows: "<<src.rows << endl;
    cout << "src type: "<< src.type() << endl;
    */

    /*
    Rect rec(0, 130, 120,90);
    Mat roi = Mat(src, rec);
    imshow("roi", roi);
    moveWindow("roi", 300, 300);

    roi.adjustROI(-5, 0, -5, -10);
    imshow("roi adj", roi);
    moveWindow("roi adj", 500, 500);
    */
    /*
    Mat dst;
    src.assignTo(dst, -1);
    imshow("dst",dst);
    */

    /*
    src.assignTo(src, CV_16FC3);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    */

    /*
    int mdata[] = { 10,10 };
    Mat m = Mat(1, mdata, CV_8UC1);
    for (size_t i = 0; i < 10; i++)
    {
        m.at<uchar>(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at<uchar>(i) << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC1);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            m.at<uchar>(i, j) = i + j;
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
            cout << (int)m.at<uchar>(i, j);
        cout << endl;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            m.at<uchar>((i, j),0) = j;
            m.at<uchar>((i, j), 1) = j + 1;
            m.at<uchar>((i, j), 2) = j+ 2;
        }
    }
    for (size_t i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            cout << (int)m.at<uchar>((i, j),0);
            cout << (int)m.at<uchar>((i, j), 1);
            cout << (int)m.at<uchar>((i, j), 2) << "  ";
        }
        cout << endl;
    }
    */
 
    
    //Mat m = Mat(5, 5, CV_8UC1);
    //int const length = m.cols * m.rows*m.channels();
    //Point mdata[25] = {};
    //Vec<int, 25> mdata;
   
    /*
    for (int i = 0; i < m.rows; i++)
    {
        for (int j = 0; j < m.cols; j++)
        {
            mdata[i * 5 + j].x = i;
            mdata[i * 5 + j].y = j;
        }
    }
    */

    /*
    for (int i = 0; i < length; i++)
    {
        mdata[i] = i;
    }
    for (size_t i = 0; i < length; i++)
    {
        m.at<uchar>(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at<uchar>(mdata[i]) << endl;
    }
    */

    //Mat m = Mat(5, 5, CV_8UC1);
    
    //typedef Vec<uchar, 1> vec;
    
    //MatIterator_<uchar> it_start = m.begin<uchar>();
    //MatIterator_<uchar> it_end = m.end<uchar>();


    //MatConstIterator_<uchar> it1_start = m.begin<uchar>();
    //MatConstIterator_<uchar> it1_end = m.end<uchar>();

    
    /*
    while (it_start != it_end)
    {
        *it_start = i + 1;
        i++;
        it_start++;
    }
    */

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec<uchar, 3> vec;

    MatIterator_<vec> it_start = m.begin<vec>();
    MatIterator_<vec> it_end = m.end<vec>();

    MatConstIterator_<vec> it1_start = m.begin<vec>();
    MatConstIterator_<vec> it1_end = m.end<vec>();
    int i = 0;
    while (it_start != it_end)
    {
        it_start[0] = 255-i;
        it_start[1] = 255 - 2 * i;
        it_start[1] = 255 - 3 * i;
        i++;
        it_start++;
    }
    while (it1_start != it1_end)
    {
        cout <<*it1_start<<"  ";
        it1_start++;
    }
    cout <<endl;
    cout << m << endl;
    */
    
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);

    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;
    cout << "src channels:  " << src.channels() << endl;
    //cout << src.checkVector(src.channels(), -1, true)<<endl;

    Mat dst = src.clone();

    imshow("dst", dst);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;
    cout << " dst channels:  " << dst.channels() << endl;
    */

    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    cout << "src cols: " << src.cols << endl;
    cout << "src rows: " << src.rows << endl;
    cout << "src type: " << src.type() << endl;

    //Mat dst = src.col(5); 

    Mat dst = src.colRange(5,150);
    Mat dst1 = src.colRange(Range(50,220));
    //dst.cols = 100;
    imshow("dst", dst);
    imshow("dst1", dst1);
    moveWindow("dst1", 0, 200);

    cout << " dst cols: " << dst.cols << endl;
    cout << " dst rows: " << dst.rows << endl;
    cout << " dst type: " << dst.type() << endl;

    cout << " dst1 cols: " << dst1.cols << endl;
    cout << " dst1 rows: " << dst1.rows << endl;
    cout << " dst1 type: " << dst1.type() << endl;
    */
    
    /**
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    src.convertTo(src, src.type(), 1.2, 0);
    imshow("src new", src);
    */
    
    /*
    Mat src = Mat(5, 5, CV_8UC1);
    cout << src.size() << endl;

    Mat dst = Mat(8, 8, CV_8UC3);
    
    src.copySize(dst);
    cout << src.size() << endl;
    */
   
    /*
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src", src);
    Mat dst;
    src.copyTo(dst);
    imshow("dst", dst);

    Mat mask(src.size(), CV_8UC1, cv::Scalar(255));
    mask(Rect(0, 0, src.cols/2, src.rows / 2)) = Scalar(0);

    Mat dst1(src.size(), src.type());
    src.copyTo(dst1, mask);
    imshow("dst1", dst1);
    */
    
    Mat src = imread("1.bmp");
    if (src.empty())
    {
        cout << "Load image failed!" << endl;
        return -1;
    }
    imshow("src 1th", src);

    src.create(src.rows-10, src.cols-10, src.type());
    imshow("src 2th", src);

    src.create(Size(src.rows, src.cols + 10), src.type());
    imshow("src 3th", src);

    int size[] = { 250,230 };
    src.create(2, size, CV_8UC3);
    imshow("src 4th", src);

    vector<int> vec(2);
    vec[0] = 230;
    vec[1] = 250;
    
    src.create(vec, CV_8UC3);
    imshow("src 5th", src);
    

    waitKey(0);
    return 0;
}

试运行,结果如下:

        由于篇幅关系,OpenCV Mat类的其他常用成员函数就暂时介绍到这里,剩余部分函数将在下篇中介绍。

        本篇博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://download.csdn.net/download/billliu66/88839772

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现新能源电池回收系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

LabVIEW智能监测系统

LabVIEW智能监测系统 设计与实现一个基于LabVIEW的智能监测系统&#xff0c;通过高效的数据采集和处理能力&#xff0c;提高监测精度和响应速度。系统通过集成传感器技术与虚拟仪器软件&#xff0c;实现对环境参数的实时监测与分析&#xff0c;进而优化监控过程&#xff0c;提…

一些配置问题记录

真的很感慨 为什么一开始的下载的软件还能用 卸载或重装后的软件总是存在各种各样的错误 真令人心烦 GNURADIO运行简单的采集信号程序报错&#xff0c; 其实不太理解为什么会出现这类错误&#xff0c;解决方法为 安装 jackd2 软件包&#xff0c;然后尝试手动启动 Jack 服务器…

通过玩游戏学会AWS

游戏名字&#xff1a; Cloud Quest 类型&#xff1a;亚马逊云科技官方出了一款 3D 角色扮演、虚拟城市建造形式的游戏实验课 进入方法&#xff1a;浏览器搜索 Cloud Quest&#xff08;或扫描下方二维码&#xff09;进入 Cloud Quest 课程页。 选择以下的链接 点击进行注册 进…

力扣题目训练(12)

2024年2月5日力扣题目训练 2024年2月5日力扣题目训练476. 数字的补数482. 密钥格式化485. 最大连续 1 的个数148. 排序链表164. 最大间距 2024年2月5日力扣题目训练 2024年2月5日第十二天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简单题3道、中等题2道和…

21种matlab信号分解方法汇总

21中信号分解方法汇总 CEEMD(互补集合经验模态分解)CEEMDAN(自适应噪声完备集合经验模态分解) EEMD(集合经验模态分解&#xff09;EMD(经验模态分解)ESMD(极点对称模态分解&#xff09;EWT(经验小波变换分解)FEEMD(快速EEMD分解)ICEEMDAN(改进自适应噪声完备集合经验模态分解)L…

微波炉维修笔记

微波主要是靠2.45GHz 左右的微波(12.2cm 波长)加热水分子实现食物加热 所有不要使用金属器皿进行加热&#xff0c;要么因为电磁屏蔽&#xff0c;起不到加热效果&#xff0c;要么火光四射 微波炉基本组成 借鉴姜师傅的视频 碰到不加热其它都正常的问题 1.检查高压电容 使用万…

安装luajit及使用python运行lua脚本

使用Python运行lua脚本前&#xff0c;需要先安装LuaJIT&#xff0c;LuaJIT的官网是下载 (luajit.org) 目前已不再使用.exe文件的下载方式&#xff0c;需要使用Git从公共仓库下载源码&#xff0c;git命令为&#xff1a; $ git clone https://luajit.org/git/luajit.git 下载后…

解决ubuntu登录密码问题

解决ubuntu登录密码问题 不要随便删除密码&#xff0c;不要随便改密码&#xff0c;很容导致密码过期&#xff0c;或者密码无效。参考了很多人的做法&#xff0c;都没有得到解决。下面的过程&#xff0c;够详细了&#xff0c;我就是这么搞好的。 1、重启虚拟机&#xff0c;不停…

数据的力量:构筑现代大型网站之数据库基础与应用

目录 数据库基础知识--前言 大型网站架构特点 DBA数据库管理员 什么是数据? 数据存储 什么是数据库 数据表的概念 为什么需要mysql这样的数据库管理工具&#xff1f;★ DBMS 收费数据库与免费数据库 运维和数据库 开发与运维的不同阶段 数据库类别 数据库具体应用…

数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 从前的日色变得慢&#xff0c;车&#xff0c;马&#xff0c;邮件都慢&#xff0c;一生,只够爱一个人。 概述 二叉树的层序遍历可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。具体步骤如下&…

Open CASCADE学习|布尔运算后消除内部拓扑

在CAD建模中&#xff0c;布尔运算是一种逻辑运算方法&#xff0c;通过这种方法&#xff0c;可以创建、修改或组合几何对象。布尔运算主要包括并集&#xff08;UNION&#xff09;、交集&#xff08;INTERSECT&#xff09;和差集&#xff08;SUBTRACT&#xff09;三种运算。 并集…

React18原理: React核心对象之ReactElement对象和Fiber对象

React中的核心对象 在React应用中&#xff0c;有很多特定的对象或数据结构.了解这些内部的设计&#xff0c;可以更容易理解react运行原理列举从react启动到渲染过程出现频率较高&#xff0c;影响范围较大的对象&#xff0c;它们贯穿整个react运行时 如 ReactElement 对象如 Fi…

「函数小课堂」~(C语言)

先赞后看&#xff0c;不足指正! 这将对我有很大的帮助&#xff01; 所属专栏&#xff1a;C语言知识 阿哇旭的主页&#xff1a;Awas-Home page 目录 引言 1. 函数的概念 2. 函数的类型 2.1 库函数 2.2 自定义函数 2.2.1 语法 2.2.2 举例 3. 函数的参数 3.1 实参 3.2 形参…

International Marine Purchasing Association 7(IMPA7)

​IMPA7物料 物料手持下载链接&#xff1a;https://pan.baidu.com/s/13m0EELpEZWlL55UhsRvI5g?pwd8888 提取码&#xff1a;8888 国际船舶物料准则International Marine Purchasing Association 7(IMPA7)。 IMPA是英文“International Marine Purchasing Association”缩写…

vue-vuex(七)

阅读文章你可以收获&#xff1a; 1 了解什么是vuex 2 知道如何在vue项目中集成vuex 3 知道vuex由什么组成&#xff0c;并如何使用 vuex概述 1. 是什么&#xff1a;vuex 是一个 vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex 是一个插件&#xff0…

Swing程序设计(10)列表框,文本框,文本域,密码框

文章目录 前言一、列表框二、文本框&#xff08;域&#xff09; 1.文本框2.文本域三、密码框总结 前言 该篇文章简单介绍了Java中Swing组件里的列表框、文本框、密码框。 一、列表框 列表框&#xff08;JList&#xff09;相比下拉框&#xff0c;自身只是在窗体上占据固定的大小…

CSS概述 | CSS的引入方式 | 选择器

文章目录 1.CSS概述2.CSS的引入方式2.1.内部样式表2.2.行内样式表2.3.外部样式表 3.选择器 1.CSS概述 CSS&#xff0c;全称Cascading Style Sheets&#xff08;层叠样式表&#xff09;&#xff0c;是一种用来设置HTML&#xff08;或XML等&#xff09;文档样式的语言。CSS的主要…

文件夹删不掉,显示在另一个文件中打开怎么办

问题&#xff1a; 一、想要删掉这个文件夹&#xff0c;却因为文件夹中的文件打开了删不掉&#xff0c;这里我因为做的测试&#xff0c;所以是知道打开了什么 二、一般情况下文件比较多时&#xff0c;是不知道打开了什么的&#xff0c;长这个样子 解决&#xff1a; 一、打开任…

【C Primer Plus第六版 学习笔记】 第十七章 高级数据表示

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 链表&#xff1a;假设要编写一个程序&#xff0c;让用户输入一年内看过的所有电影&#xff0c;要储存每部影片的片名和评级。 #include <stdio.h> #include <stdlib.h> /* 提供malloc()的原型 */ #include <s…