opencv初体验
http://guoming.me/opencv-config 这篇文章有讲解opencv的安装与配置
一些常用库
opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_features2d249d.lib opencv_calib3d249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib opencv_gpu249d.lib
一个测试程序
<strong>#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; </strong>int main() { Mat image; image = imread("D:\\lenargb.jpg", -1); // Read the file if (!image.data) // Check for invalid input { cout << "Could not open or find the image" << std::endl; return -1; } namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display. imshow("Display window", image); // Show our image inside it. waitKey(0); // Wait for a keystroke in the window return 0; }
Mat 类的一些属性
//矩阵的维数,取值应该大于或等于 2 int dims; //矩阵的行数和列数,如果矩阵超过 2 维,这两个变量的值都为-1 int rows, cols; //指向数据的指针 uchar* data;<strong> </strong>
Mat 构造方法
Mat M(3,2, CV_8UC3, Scalar(0,0,255)); cout << "M = " << endl << " " << M << endl;<strong> </strong>
第一行代码创建一个行数(高度)为 3,列数(宽度)为 2 的图像,图像元素是 8 位无符号整数类型,且有三个通道。图像的所有像素值被初始化为(0, 0,255)。由于 OpenCV 中默认的颜色顺序为 BGR,因此这是一个全红色的图像。
第二行代码是输出 Mat 类的实例 M 的所有像素值。 Mat 重定义了<<操作符,使用这个操作符,可以方便地输出所有像素值,而不需要使用 for 循环逐个像素输出
opencv中图像的通道数基本上,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。
如果一个像素点,有RGB三种颜色来描述它,就是三通道
windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,表示透明度。
最后这个,一般叫做alpha通道,表示透明度的。
初学只要知道单通道和三通道就好;
创建图像对象
Mat常用的构造函数:
Mat(int rows,int cols,int type,const scalar &s);
其中 rows 表示行数,cols表示列数,两者可以结合为Size size;
Type 可以是 CV_8UC1, CV_16SC1, …,CV_64FC4 等。里面的 8U 表示 8 位无符号整数,16S 表示 16 位有符号整数,64F表示 64 位浮点数(即 double 类型);C 后面的数表示通道数,例如 C1 表示一个通道的图像,C4 表示 4 个通道的图像,以此类推。
如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:Mat M(3,2, CV_8UC(5));//创建行数为 3,列数为 2,通道数为 5 的图像
Scalar 可以设置通道里的像素值;可有可无。可以使用 Mat 类的 create()函数创建图像。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { Mat img(3, 2, CV_8UC3, Scalar(100, 100, 200)); cout << "M=" << endl << " " << img << endl; img.create(3, 2, CV_8UC1); cout << "M=" << endl <<" "<< img << endl; //imshow("嘿嘿", img); //waitKey(); system("pause"); return 0; }
遍历像素
(1) at()函数 是个模版函数;需要指明元素类型
#include <time.h> #include <iostream> #include "opencv2/opencv.hpp" //一般用这个头文件就可以,只不过可能会把大部分用不到的头文件引入进来; using namespace std; using namespace cv; int main(int argc, char* argv[]) { srand(time(NULL)); Mat grayim(600, 800, CV_8UC1);//600*800的灰度图; Mat colorim(600, 800, CV_8UC3);//600*800的彩色图; //遍历所有像素,并设置像素值; for (int i = 0; i < grayim.rows; ++i)//Mat的rows和cols属性是public的; 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; }OpenCV 中有模板类 Vec,可以表示一个向量,用来表示彩色图像的一个像素;例如 8U 类型的 RGB 彩色图像可以使用 Vec3b,3 通道 float 类型的矩阵可以使用 Vec3f
Vec3b color; //用 color 变量描述一种 RGB 颜色 color[0]=255; //B 分量 color[1]=0; //G 分量 color[2]=0; //R 分量
2) 使用STL库里的迭代器,
<span style="font-size:14px;">#include <time.h> #include <iostream> #include "opencv2/opencv.hpp" //一般用这个头文件就可以,只不过可能会把大部分用不到的头文件引入进来; using namespace std; using namespace cv; int main(int argc, char* argv[]) { srand(time(NULL)); Mat grayim(600, 800, CV_8UC1);//600*800的灰度图; Mat colorim(600, 800, CV_8UC3);//600*800的彩色图; //遍历所有像素,并设置像素值; MatIterator_<uchar> graim_it, graim_end; MatIterator_<Vec3b> color_it, color_end; for (graim_it=grayim.begin<uchar>(),graim_end=grayim.end<uchar>(); graim_it!=graim_end; ++graim_it) { *graim_it = rand() % 255; } for (color_it = colorim.begin<Vec3b>(), color_end = colorim.end<Vec3b>(); color_it != color_end; color_it++) { (*color_it)[0] = rand() % 255; (*color_it)[1] = rand() % 255; (*color_it)[2] = 0; } //显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; }</span>
如果想看全部内容 请移步我的博客园 http://www.cnblogs.com/dragonfive/p/4480224.html
作者:在河之博
出处:http://www.cnblogs.com/dragonfive/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。