当前位置: 首页 > news >正文

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

相关文章:

OpenCV Mat实例详解 四

OpenCV Mat实例详解三中详细介绍来了OpenCV Mat类的公有静态成员函数&#xff0c;下面介绍OpenCV Mat类的其他常用成员函数。 OpenCV Mat类常用成员函数 Mat & adjustROI (int dtop, int dbottom, int dleft, int dright)&#xff1b; dtop ROI 上边界移动值&#xff0c;如…...

Fluke ADPT 连接器新增对福禄克万用 Fluke 106 的支持

所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b; 2、Fluke 106&#xff1b; Fluke 106 拆机图&#xff1a; 显示界面如下图&#xff1a; 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造&#xff01;&#xff01;&#xff01;...

算法-3-基本的数据结构

单双链表 1.单链表双链表如何反转 import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int…...

探秘Java反射:灵活编程的利器

前言 大家好&#xff0c;我是chowley&#xff0c;不知道大家在学习Java的过程中有没有听过反射的概念&#xff0c;今天我来总结一下我心中的Java反射。 在Java编程中&#xff0c;反射是一种强大的工具&#xff0c;它允许程序在运行时检查和操作类、方法、属性等&#xff0c;而…...

记录 | ubuntu pyqt5 pycharm配置

Ubuntu16.04pycharmpyqt5安装与配置_ubuntu pycharm pyqt5-CSDN博客pycharm激活码 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHcm91cCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN…...

ESP32学习(1)——环境搭建

使用的ESP32板子如下图所示 它可以用Arduino 软件&#xff0c;基于C语言开发。但是&#xff0c;在这里&#xff0c;我是用Thonny软件&#xff0c;基于micro_python对其进行开发。 1.安装Thonny Thonny的软件安装包&#xff0c;可以去它官网上下载。Thonny, Python IDE for begi…...

Attention Is All Your Need论文笔记

论文解决了什么问题&#xff1f; 提出了一个新的简单网络架构——transformer&#xff0c;仅仅是基于注意力机制&#xff0c;完全免去递推和卷积&#xff0c;使得神经网络训练地速度极大地提高。 We propose a new simple network architecture, the Transformer, based sole…...

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…...

CGAL::2D Arrangements-7

7 几何Traits 几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现&#xff0c;供Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括…...

linux系统下vscode portable版本的rust环境搭建004:rust

目的&#xff1a;希望在获得一个新的系统之后&#xff0c;以最简便快速的方式搭配一个rust的编程环境命令在线安装只执行这句就行了 &#xff1a;curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh&#xff0c;因为是要portable安装所以按照以下的方式执行。 下载…...

从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用

多线程并发的竞态问题 我们创建三个线程同时进行购票&#xff0c;代码如下 #include<iostream> #include<thread> #include<list> using namespace std; //总票数 int ticketCount100; //售票线程 void sellTicket(int idx) {while(ticketCount>0){cou…...

高程 | 多态性(c++)

文章目录 &#x1f4da;多态&#x1f4da;运算符重载&#x1f407;定义&#x1f407;规则&#x1f407;友元运算符重载函数&#x1f407;成员运算符重载函数 &#x1f4da;虚函数&#x1f4da;纯虚函数和抽象类 &#x1f4da;多态 多态&#xff1a;同样的消息被不同类型的对象…...

LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装 Keil MDK&#xff0c;也称MDK-ARM&#xff0c;Realview MDK &#xff08;Microcontroller Development Kit&#xff09;等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。 MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备…...

[uniapp生命周期]详细讲解uniapp中那些属于vue生命周期,那些属于uniapp独有的生命周期,以及这中间的区别 相关的内容和api 代码注释

目录 1. Vue.js生命周期函数2.Vue生命周期函数代码beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed$nextTick$forceUpdate$destroy 3. UniApp独有的生命周期函数onLaunchonShowonHideonError 4.总结 在UniApp中&#xff0c;除了Vue.js的生命周…...

【动态规划】【记忆化搜索】【状态压缩】1681. 最小不兼容性

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 状态压缩 记忆化搜索 1681. 最小不兼容性 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中&#xff0c;使得同一…...

JVM-类加载器 双亲委派机制

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&a…...

vue axios 请求后端无法传参问题

vue请求后端无法传参问题 问题描述处理过程总结 问题描述 在学习vue时&#xff0c;使用axios调用后端&#xff0c;发现无法把参数正确传到后端&#xff0c;现象如下&#xff1a; 使用vue发起请求&#xff0c;浏览器上已经有传参&#xff0c;但是后端没接收到对应的用户名密码&…...

打印最小公倍数

打印最小公倍数 题目描述&#xff1a; 输入2个整数m和n&#xff0c;计算m和n的最小公倍数&#xff0c;并打印出结果 测试1&#xff1a; 输入&#xff1a;18 24 输出&#xff1a;72 测试2&#xff1a; 输入&#xff1a;18 6 输出&#xff1a;18解法思路: 最小公倍数是指两个…...

[AIGC] Java 和 Kotlin 的区别

好的&#xff0c;我还是以“萌萌哒小码农”的身份继续回答您的问题。 Java 和 Kotlin 是两种不同的编程语言&#xff0c;它们有许多共同点&#xff0c;但也有一些重要的区别。以下是一些常见的 Java 和 Kotlin 的区别&#xff1a; 语法 Kotlin 的语法比 Java 简洁得多&#…...

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...