当前位置: 首页 > 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;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...