ps:需要注意的是,如果要遍历图像,并不推荐使用 at()函数。使用这个函数的优点是代码的可读性高,但是效率并不是很高。 /// bianlixiangsu.cpp : 定义控制台应用程序的入口点。 //2016.2.17 来自opencv 入门教程 3.5.1 at()函数 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); //遍历所有像素,并设置像素值 for( int i = 0; i < grayim.rows; ++i) for( int j = 0; j < grayim.cols; ++j ) grayim.at<uchar>(i,j) = (i+j)%255; //遍历所有像素,并设置像素值 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; } //显示结果 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); //遍历所有像素,并设置像素值 MatIterator_<uchar> grayit, grayend; for( grayit = grayim.begin<uchar>(), grayend =grayim.end<uchar>(); grayit != grayend; ++grayit) *grayit = rand()%255; //遍历所有像素,并设置像素值 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 } //显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; } */ //3.5.3 通过数据指针 #include "stdafx.h" #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { //3.6.1 单行或单列选择 //参数 i 和 j 分别是行标和列标。例如取出 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 中新增的类,该类有两个关键变量 star 和 end。 Range 对 //象可以用来表示矩阵的多个连续的行或者多个连续的列。其表示的范围为从 start //到 end,包含 start,但不包含 end。 Range 类的定义如下: //Range 类还提供了一个静态方法 all(),这个方法的作用如同 Matlab 中的“ :”,表示所有的行或者所有的列。 //创建一个单位阵 //Mat A = Mat::eye(10, 10, CV_32S); //提取第 1 到 3 列(不包括 3) 从0开始计数- Mat B = A(Range::all(), Range(1, 3)); //提取 B 的第 5 至 9 行(不包括 9) //其实等价于 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 感兴趣区域 //从图像中提取感兴趣区域( Region of interest) 有两种方法,一种是使用构造 //函数,如下例所示: //创建宽度为 320,高度为 240 的 3 通道图像 Mat img(Size(320,240),CV_8UC3); //roi 是表示 img 中 Rect(10,10,100,100)区域的对象 Mat roi(img, Rect(10,10,100,100)); //除了使用构造函数,还可以使用括号运算符, 如下: Mat roi2 = img(Rect(10,10,100,100)); //当然也可以使用 Range 对象来定义感兴趣区域,如下: //使用括号运算符 Mat roi3 = img(Range(10,100),Range(10,100)); //3.5.3 通过数据指针 Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍历所有像素,并设置像素值 for( int i = 0; i < grayim.rows; ++i) { //获取第 i 行首像素指针 uchar * p = grayim.ptr<uchar>(i); //对第 i 行的每个像素(byte)操作 for( int j = 0; j < grayim.cols; ++j ) p[j] = (i+j)%255; } //遍历所有像素,并设置像素值 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 } } //显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; } |
|
来自: 昵称14216904 > 《opencv》