OpenCV Mat实例详解 四

        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 
#include 

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: "<

试运行,结果如下:

OpenCV Mat实例详解 四_第1张图片

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

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

#include 
#include 

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: "<

     试运行,结果如下:

OpenCV Mat实例详解 四_第2张图片最下面 的图片即为调用adjustROI函数调整后的ROI区域,不再包含误选的元件。

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

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

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

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

#include 
#include 

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: "<

试运行,结果如下:

OpenCV Mat实例详解 四_第3张图片

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

#include 
#include 

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: "<

试运行,结果如下:

OpenCV Mat实例详解 四_第4张图片

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

        at() 

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

template  _Tp &  at (int i0=0)

 template  _Tp &  at (int i0=0) const

template    _Tp &  at (int row, int col)

template   const _Tp &  at (int row, int col) const

template    _Tp & at (int i0, int i1, int i2)

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

template    _Tp & at (const int *idx)

template   const _Tp & at (const int *idx) const

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

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

template   _Tp &   at (Point pt)

template  const  _Tp &   at (Point pt) const

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

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(i) << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第5张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(i, j);
        cout << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第6张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((i, j), 2) << "  ";
        }
        cout << endl;
    }

    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第7张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第8张图片

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    
    
    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第9张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    
    
    waitKey(0);
    return 0;
}

 试运行,结果如下:

OpenCV Mat实例详解 四_第10张图片

template  MatIterator_< _Tp >  begin ()

template  MatIterator_< _Tp >  begin () const

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第11张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第12张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下: 

OpenCV Mat实例详解 四_第13张图片

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 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第14张图片

CV_NODISCARD_STD Mat clone () const

返回一个克隆的Mat对象。

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第15张图片

Mat  col (int x) const

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

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第16张图片

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下: 

OpenCV Mat实例详解 四_第17张图片

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

Mat  colRange (int startcol, int endcol) const

Mat colRange (const Range &r) const

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

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:  

OpenCV Mat实例详解 四_第18张图片

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

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

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

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

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

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

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

OpenCV Mat实例详解 四_第19张图片

void  copySize (const Mat &m)

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

m 源Mat对象

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

 试运行,结果如下:

OpenCV Mat实例详解 四_第20张图片

void copyTo (OutputArray m) const

void  copyTo (OutputArray m, InputArray mask) const

拷贝到另一个Mat对象

m 目标Mat对象

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

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

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

#include 
#include 

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 <

试运行,结果如下:

OpenCV Mat实例详解 四_第21张图片

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: "<(i) = i;
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << (int)m.at(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(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(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((i, j),0) = j;
            m.at((i, j), 1) = j + 1;
            m.at((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((i, j),0);
            cout << (int)m.at((i, j), 1);
            cout << (int)m.at((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 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(mdata[i]) = (uchar)i;
        
    }
    for (int i = 0; i < length; i++)
    {
        cout << (int)m.at(mdata[i]) << endl;
    }
    */

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


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

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

    /*
    Mat m = Mat(5, 5, CV_8UC3);
    typedef Vec vec;

    MatIterator_ it_start = m.begin();
    MatIterator_ it_end = m.end();

    MatConstIterator_ it1_start = m.begin();
    MatConstIterator_ it1_end = m.end();
    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 < vec(2);
    vec[0] = 230;
    vec[1] = 250;
    
    src.create(vec, CV_8UC3);
    imshow("src 5th", src);
    

    waitKey(0);
    return 0;
}

试运行,结果如下:

OpenCV Mat实例详解 四_第22张图片

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

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

你可能感兴趣的:(opencv,人工智能,计算机视觉,OpenCV,Mat实例详解四,Mat常用成员函数用法详解,Mat类成员函数用法示例)