OpenCV算法精解2--OpenCV中C++基本操作2
生活随笔
收集整理的這篇文章主要介紹了
OpenCV算法精解2--OpenCV中C++基本操作2
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼環(huán)境:Visual studio2017和Anaconda;
參考書籍:張平《OpenCV算法精解》;
編程語言:Python和C++;
Python3基礎(chǔ)學(xué)習(xí):Python3基礎(chǔ)
C++基礎(chǔ)學(xué)習(xí):C++基礎(chǔ)
1.構(gòu)造多通道Mat對象
// 6.構(gòu)造多通道Mat對象 // 構(gòu)造一個由n個rows×cols二維浮點型矩陣組成的三維矩陣; // 語法:Mat(int rows,int cols,CV_32FC(n)) #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 6.構(gòu)造多通道Mat對象Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));cout << "多通道Mat對象:\n" << array1 << endl;return 0; }2.訪問多通道Mat對象中的值
// 7.訪問多通道Mat對象中的值 // 7.1 利用成員函數(shù)at // 利用成員函數(shù)at訪問多通道Mat的元素值,可以將多通道Mat看作一個特殊的二維數(shù)組,每一個位置上不是一個數(shù)值,而是一個向量; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.1 利用成員函數(shù)at訪問多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {for (int c = 0; c < array1.cols; c++) {cout << array1.at<Vec3f>(r, c) << ","; // 打印第r行第c列的元素值;}cout << endl;}return 0; } // 7.2 利用成員函數(shù)ptr // 成員函數(shù)ptr可以返回指向指定行的第一個元素的指針(不是第一個數(shù)值) #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.2 利用成員函數(shù)ptr訪問多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {Vec3f* ptr = array1.ptr<Vec3f>(r); // 每行首元素的地址;for (int c = 0; c < array1.cols; c++) {cout << ptr[c] << ",";}cout << endl;}return 0; } // 7.3 利用成員函數(shù)isContinous和ptr訪問多通道的值 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.3 利用成員函數(shù)isContinous和ptr訪問多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));if (array1.isContinuous()){Vec3f *ptr = array1.ptr<Vec3f>(0); // 指向多通道矩陣的第一個元素的指針;for (int n = 0; n < array1.rows*array1.cols; n++) {cout << ptr[n] << endl;}}return 0; } // 7.4 利用成員變量和step訪問 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.4 利用成員函數(shù)data和step訪問多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {for (int c = 0; c < array1.cols; c++) {Vec3f *ptr = (Vec3f*)(array1.data + r * array1.step[0] + c * array1.step[1]); // 得到指向每個元素的指針;cout << *ptr << ","; // 打印元素}}return 0; } // 7.5 分離通道 // 分離通道:將所有向量的第一個值組成的單通道矩陣作為第一通道,將所有向量的第二元素組成的單通道矩陣作為第二通道,依此類推; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.5 分離通道Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));vector<Mat> planes;split(array1, planes);cout << "原來的矩陣:\n" << array1 << endl;cout << "第一通道:\n" << planes[0] << endl;cout << "第二通道:\n" << planes[1] << endl;cout << "第三通道:\n" << planes[2] << endl;return 0; } // 7.6 合并通道 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 7.6 合并通道// Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));// 單通道數(shù)據(jù)Mat plane0 = (Mat_<int>(2, 2) << 1, 2, 3, 4);Mat plane1 = (Mat_<int>(2, 2) << 5, 6, 7, 8);Mat plane2 = (Mat_<int>(2, 2) << 1, 3, 5, 7);Mat plane[] = { plane0,plane1,plane2 }; // 初始化一個數(shù)組;Mat mat1;merge(plane, 3, mat1);cout << "plane0:\n" << plane0 << endl;cout << "plane1:\n" << plane1 << endl;cout << "plane2:\n" << plane2 << endl;cout << "合并通道后:\n" << mat1 << endl;// 將單通道矩陣依次放入vector容器中vector<Mat> planeTank;planeTank.push_back(plane0);planeTank.push_back(plane1);planeTank.push_back(plane2);Mat mat2;merge(planeTank, mat2);cout << "把單通道矩陣放入vector容器中:\n" << mat2 << endl;return 0; }3.獲得Mat中某一區(qū)域的值
// 8.獲得Mat中某一區(qū)域的值 // 8.1 使用成員函數(shù)row(i)或col(j)得到矩陣的第i行或第j列; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 8.1 使用成員函數(shù)row(i)或col(j)獲得矩陣的第i行或第j列Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));int r = 1;int c = 1;Mat arrayRow = array1.row(r); // 矩陣第r行;Mat arrayCol = array1.col(c); // 矩陣第c列;cout << "矩陣內(nèi)容:\n" << array1 << endl;cout << "矩陣第1行:\n" << arrayRow << endl;cout << "矩陣第1列:\n" << arrayCol << endl;return 0; } // 8.2 使用成員函數(shù)rowRange或colRange得到矩陣的連續(xù)行或連續(xù)列 // 成員函數(shù)row、col、rowRange、colRange返回的矩陣指向原矩陣,如果改變原矩陣的值,會跟著改變; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造一個5×5的矩陣:1 2 3 4 56 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "matrix矩陣內(nèi)容:\n" << matrix << endl;cout << "-----------------------------" << endl;Mat r_range = matrix.rowRange(Range(2, 4)); // 訪問matrix第2、3行,Range:左閉右開;for (int r = 0; r < r_range.rows; r++) {for (int c = 0; c < r_range.cols; c++) {cout << r_range.at<int>(r, c) << ",";}cout << endl;}return 0; } // 8.3 成員函數(shù)clone和copyTo // clone和copyTo用于將矩陣克隆或復(fù)制一份; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造一個5×5的矩陣:1 2 3 4 56 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "原矩陣的內(nèi)容:\n" << matrix << endl;cout << "---------------------------" << endl;// 使用clone成員函數(shù)和copyTo成員函數(shù)Mat r_range1 = matrix.rowRange(2, 4).clone();Mat r_range2;matrix.rowRange(2, 4).copyTo(r_range2);cout << "r_range1的內(nèi)容:\n" << r_range1 << endl;cout << "r_range2的內(nèi)容:\n" << r_range2 << endl;cout << "---------------------------" << endl;// 改變r_range1和r_range2某個值;r_range1.at<int>(0, 0) = 584;r_range2.at<int>(0, 0) = 584;cout << "r_range1的內(nèi)容:\n" << r_range1 << endl;cout << "r_range2的內(nèi)容:\n" << r_range2 << endl;cout << "---------------------------" << endl;cout << "matrix內(nèi)容:\n" << matrix << endl;return 0; } // 8.4 使用Rect類 /* 構(gòu)造函數(shù):Rect(int_x,int_y,int_width,int_height); int_x:左上角x坐標(biāo); int_y:左上角y坐標(biāo); int_width:寬度; int_height:高度; */ #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造一個5×5的矩陣:1 2 3 4 56 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "原矩陣的內(nèi)容:\n" << matrix << endl;cout << "---------------------------" << endl;// 使用Rect類Mat roi1 = matrix(Rect(Point(2, 1), Point(4, 3))); // 左上角坐標(biāo),右下角坐標(biāo);Mat roi2 = matrix(Rect(2, 1, 2, 2)); // x,y,寬度,高度;Mat roi3 = matrix(Rect(Point(2, 1), Size(2, 2))); // 左上角坐標(biāo),尺寸;cout << "roi1:\n" << roi1 << endl;cout << "roi2:\n" << roi2 << endl;cout << "roi3:\n" << roi3 << endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的OpenCV算法精解2--OpenCV中C++基本操作2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原】AMR音频解码插件开发总结
- 下一篇: 如何在textarea中显示html代码