ps:需要注意的是,如果要遍歷圖像,并不推薦使用 at()函數(shù)。使用這個(gè)函數(shù)的優(yōu)點(diǎn)是代碼的可讀性高,但是效率并不是很高。 /// bianlixiangsu.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 //2016.2.17 來(lái)自opencv 入門教程 3.5.1 at()函數(shù) 3.5.2 使用迭代器 page28- /* #include "stdafx.h" #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍歷所有像素,并設(shè)置像素值 for( int i = 0; i < grayim.rows; ++i) for( int j = 0; j < grayim.cols; ++j ) grayim.at<uchar>(i,j) = (i+j)%255; //遍歷所有像素,并設(shè)置像素值 for( int i = 0; i < colorim.rows; ++i) for( int j = 0; j < colorim.cols; ++j ) { Vec3b pixel; pixel[0] = i%255; //Blue pixel[1] = j%255; //Green pixel[2] = 0; //Red colorim.at<Vec3b>(i,j) = pixel; } //顯示結(jié)果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; } */ /* //3.5.2 使用迭代器 #include "stdafx.h" #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍歷所有像素,并設(shè)置像素值 MatIterator_<uchar> grayit, grayend; for( grayit = grayim.begin<uchar>(), grayend =grayim.end<uchar>(); grayit != grayend; ++grayit) *grayit = rand()%255; //遍歷所有像素,并設(shè)置像素值 MatIterator_<Vec3b> colorit, colorend; for( colorit = colorim.begin<Vec3b>(), colorend = colorim.end<Vec3b>(); colorit != colorend; ++colorit) { (*colorit)[0] = rand()%255; //Blue (*colorit)[1] = rand()%255; //Green (*colorit)[2] = rand()%255; //Red } //顯示結(jié)果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; } */ //3.5.3 通過(guò)數(shù)據(jù)指針 #include "stdafx.h" #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { //3.6.1 單行或單列選擇 //參數(shù) i 和 j 分別是行標(biāo)和列標(biāo)。例如取出 A 矩陣的第 i 行可以使用如下代碼: Mat A = Mat::eye(10, 10, CV_32S); Mat line = A.row(1); cout<<line<<endl; //例如取出 A 矩陣的第 i 行,將這一行的所有元素都乘以 2,然后賦值給第 j行,可以這樣寫: A.row(1) = A.row(1)*2; //3.6.2 用 Range 選擇多行或多列 //Range 是 OpenCV 中新增的類,該類有兩個(gè)關(guān)鍵變量 star 和 end。 Range 對(duì) //象可以用來(lái)表示矩陣的多個(gè)連續(xù)的行或者多個(gè)連續(xù)的列。其表示的范圍為從 start //到 end,包含 start,但不包含 end。 Range 類的定義如下: //Range 類還提供了一個(gè)靜態(tài)方法 all(),這個(gè)方法的作用如同 Matlab 中的“ :”,表示所有的行或者所有的列。 //創(chuàng)建一個(gè)單位陣 //Mat A = Mat::eye(10, 10, CV_32S); //提取第 1 到 3 列(不包括 3) 從0開始計(jì)數(shù)- Mat B = A(Range::all(), Range(1, 3)); //提取 B 的第 5 至 9 行(不包括 9) //其實(shí)等價(jià)于 C = A(Range(5, 9), Range(1, 3)) Mat C = B(Range(2, 9), Range::all()); cout<<A<<endl<<B<<endl<<C<<endl<<line<<endl;//兩次輸出的line的值不一樣 此處*2了 //3.6.3 感興趣區(qū)域 //從圖像中提取感興趣區(qū)域( Region of interest) 有兩種方法,一種是使用構(gòu)造 //函數(shù),如下例所示: //創(chuàng)建寬度為 320,高度為 240 的 3 通道圖像 Mat img(Size(320,240),CV_8UC3); //roi 是表示 img 中 Rect(10,10,100,100)區(qū)域的對(duì)象 Mat roi(img, Rect(10,10,100,100)); //除了使用構(gòu)造函數(shù),還可以使用括號(hào)運(yùn)算符, 如下: Mat roi2 = img(Rect(10,10,100,100)); //當(dāng)然也可以使用 Range 對(duì)象來(lái)定義感興趣區(qū)域,如下: //使用括號(hào)運(yùn)算符 Mat roi3 = img(Range(10,100),Range(10,100)); //3.5.3 通過(guò)數(shù)據(jù)指針 Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍歷所有像素,并設(shè)置像素值 for( int i = 0; i < grayim.rows; ++i) { //獲取第 i 行首像素指針 uchar * p = grayim.ptr<uchar>(i); //對(duì)第 i 行的每個(gè)像素(byte)操作 for( int j = 0; j < grayim.cols; ++j ) p[j] = (i+j)%255; } //遍歷所有像素,并設(shè)置像素值 for( int i = 0; i < colorim.rows; ++i) { //獲取第 i 行首像素指針 Vec3b * p = colorim.ptr<Vec3b>(i); for( int j = 0; j < colorim.cols; ++j ) { p[j][0] = i%255; //Blue p[j][1] = j%255; //Green p[j][2] = 0; //Red } } //顯示結(jié)果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; } |
|
來(lái)自: 昵稱14216904 > 《opencv》