OpenCV算法精解1--OpenCV中C++基本操作1
生活随笔
收集整理的這篇文章主要介紹了
OpenCV算法精解1--OpenCV中C++基本操作1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼環境:Visual studio2017和Anaconda;
參考書籍:張平《OpenCV算法精解》;
編程語言:Python和C++;
Python3基礎學習:Python3基礎
C++基礎學習:C++基礎
1.初識Mat類
// 1.初識Mat // 1.1 Mat是Matrix的縮寫,代表矩陣或數組的意思,該類聲明在opencv2\core\core.hpp中; // 1.2 構造Mat對象相當于構造一個矩陣,需要四個要素:行數(高)、列數(寬)、通道數、數據類型;// 1.3 Mat類構造函數語法格式:Mat(int rows,int cols,int type) // 1.3.1 rows:矩陣的行數; // 1.3.2 cols:矩陣的列數; // 1.3.3 type:類型,包括通道數和數據類型;// type可以設置的值: // CV_8UC(n)、CV_8SC(n)、CV_16SC(n)、CV_16UC(n)、CV_32SC(n)、CV_32FC(n)、CV_64FC(n)、CV_64FC(n); // 說明: // a.8U、8S、16S、16U、32S、32F、64F前的數字代表Mat中每一個數值所占的bit數,1byte=8bit; // b.32F即占4個字節的float類型,64F即占8個字節的double類型,32S即占4字節的int類型,8U即占1字節的uchar類型; // c.C(n)代表通道數,n=1,構造單通道或稱二維矩陣,n>1,構造多通道矩陣即三維矩陣;2.構造單通道Mat對象
// 2.構造單通道Mat對象 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {Mat array1 = Mat(3, 4, CV_32FC(1)); // 構造3行4列的矩陣;Mat ones = Mat::ones(3, 4, CV_32FC1); // 構造3行4列全1的float類型的單通道矩陣;Mat zeros = Mat::zeros(3, 4, CV_32FC1); // 構造3行4列全0的float類型的單通道矩陣;cout << "3行4列全1矩陣:" << "\n" << ones << endl;cout << "---------------" << endl;cout << "3行4列全0矩陣:" << "\n" << zeros << endl;return 0; }3.獲得單通道Mat的基本信息
// 3.獲得單通道Mat的基本信息 /* 需要構造的矩陣為: [ 11 12 33 43 51 16 ] */ #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 1.使用成員變量rows和cols獲取矩陣的行數和列數;Mat array1 = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16); // 構造目標矩陣;cout << "矩陣行數:" << array1.rows << endl; // 打印矩陣的行數;cout << "矩陣列數:" << array1.cols << endl; // 打印矩陣的列數;// 2.使用成員函數size()獲取矩陣尺寸;Size size = array1.size();cout << "矩陣尺寸:" << array1.size << endl;// 3.使用成員函數channels()得到矩陣的通道數;cout << "矩陣通道數:" << array1.channels() << endl;// 4.使用成員函數total()得到矩陣的行數乘以列數,即面積;cout << "矩陣面積:" << array1.total() << endl;// 5.使用成員變量dims獲取矩陣的維數;cout << "矩陣維數:" << array1.dims << endl;return 0; }4.訪問單通道Mat對象中的值
// 4.訪問單通道Mat對象中的值 // 4.1 利用成員函數at訪問對象中的值; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 1.利用成員函數at訪問對象中的值;Mat array1 = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16); // 構造單通道矩陣;for (int r = 0; r < array1.rows; r++){for (int c = 0; c < array1.cols; c++) {cout << array1.at<int>(r, c) << ","; // 第r行第c列的值;}cout << endl;}return 0; } // 4.2 利用成員函數ptr訪問對象中的值; // 對于Mat中的數值在內存中的存儲,每一行的值是存儲在連續的內存區域中,通過成員函數ptr獲得指向每一行首地址的指針; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 2.利用成員函數ptr訪問對象中的值;Mat array1 = (Mat_<int>(3, 2) << 1, 2, 3, 4, 5, 6); // 構造單通道矩陣;for (int r = 0; r < array1.rows; r++){const int *ptr = array1.ptr<int>(r); // 獲得第r行行首的地址;for (int c = 0; c < array1.cols; c++) {cout << ptr[c] << ","; // 打印第r行的所有值;}cout << endl;}return 0; } // 4.3 利用成員函數isContinuous和ptr // 每一行的所有值存儲在連續的內存區域中,行與行之間可能會有間隔,如果isContinuous返回值為true,則代表行與行之間也是連續存儲的,即所有值都是連續存儲的; #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 3.利用成員函數isContinous和ptr訪問對象中的值;Mat array1 = (Mat_<int>(3, 2) << 1, 2, 3, 4, 5, 6); // 構造單通道矩陣;if (array1.isContinuous()){int *ptr = array1.ptr<int>(0); // 得到矩陣的第一個值的地址;for (int n = 0; n < array1.rows*array1.cols; n++) {cout << ptr[n] << ",";}}return 0; }5.向量類Vec
// 5.向量類Vec // 此處的向量理解為數學意義上的列向量,構造一個_cn×1的列向量,數據類型為_Tp; // 格式:Vec<Typename -Tp,int _cn> #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {// 5.向量類VecVec<int, 4> vi(1, 2, 3, 4); // 構造一個長度為4,數據類型為int且初始化為1,2,3,4的列向量;cout << "向量的行數:" << vi.rows << endl;cout << "向量的列數:" << vi.cols << endl;// 使用[]或()訪問元素;cout << "訪問第0個元素:" << vi[0] << endl;cout << "訪問第3個元素:" << vi(3) << endl;return 0; }總結
以上是生活随笔為你收集整理的OpenCV算法精解1--OpenCV中C++基本操作1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索引原理及项目中如何使用索引实例分析
- 下一篇: C++模板专门化与重载