OpenCV官方文档学习记录(1)

图像显示并转化为黑白输出到新文件

code:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 int main()
11 {
12     Mat img = imread("test.jpg",1);
13     if (img.empty())
14     {
15         return -1;
16     }
17     Mat gray_img;
18     cvtColor(img, gray_img, CV_BGR2GRAY);
19     imwrite("./black.jpg", gray_img);
20
21     namedWindow("Source", CV_WINDOW_AUTOSIZE);
22     imshow("Source", img);
23     namedWindow("Black", CV_WINDOW_AUTOSIZE);
24     imshow("Black", gray_img);
25
26     waitKey();
27     return 0;
28 }

结果:

Mat数据结构:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat A, C;
19     A = imread("test.jpg", 1);
20     Mat B(A);
21     C = A;
22     Mat D(A, Rect(10, 10, 100, 100));
23     Mat E = A(Range::all(), Range(1, 3));
24     Show("A", A);
25     Show("B", B);
26     Show("C", C);
27     Show("D", D);
28     Show("E", E);
29     waitKey();
30     return 0;
31 }

结果:

以上显示的是浅拷贝,就是除了headers不同之外,其余的数据都是从一块数据块中取得的。

要实现深拷贝:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat img = imread("test.jpg", 1);
19     Show("Source", img);
20     Mat dest = img.clone();
21     Show("Dest", dest);
22     waitKey();
23     return 0;
24 }

或是:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat img = imread("test.jpg", 1);
19     Show("Source", img);
20     Mat dest;
21     img.copyTo(dest);
22     Show("Dest", dest);
23     waitKey();
24     return 0;
25 }

构建Mat对象:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
19     cout << "M=" << endl << "" << M << endl << endl;
20     system("pause");
21     return 0;
22 }

构造器参数,行+列+图像类型+填充数据。

模仿MatLab的函数:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat E = Mat::eye(4, 4, CV_64F);
19     cout << E << endl;
20     Mat O = Mat::ones(2, 2, CV_32F);
21     cout << O << endl;
22     Mat Z = Mat::zeros(3, 3, CV_8UC1);
23     cout << Z << endl;
24     system("pause");
25     return 0;
26 }

因为默认重载了流运算符,因此可以直接输出;

对于小矩阵使用逗号初始化:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
19     cout << C << endl;
20     system("pause");
21     return 0;
22 }

可以按行列复制图像的色值:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
19     Mat Row = C.col(1).clone();
20     cout << Row << endl;
21     system("pause");
22     return 0;
23 }

随机生成矩阵方式:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat img;
19     img = Mat(400, 400, CV_8UC3);
20     randu(img, Scalar::all(0), Scalar::all(255));
21     Show("Img", img);
22     waitKey();
23     return 0;
24 }

randu后两个参数是取值范围;

矩阵值的输出格式:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Mat img;
19     img = Mat(4, 4, CV_8UC3,Scalar::all(25));
20     cout << img << endl;
21     cout << format(img, "python") << endl;
22     cout << format(img, "csv") << endl;
23     cout << format(img, "numpy") << endl;
24     cout << format(img, "C") << endl;
25     system("pause");
26     return 0;
27 }

其他可以直接用流输出的数据类型是

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4
 5 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 void Show(std::string name,Mat img)
11 {
12     namedWindow(name, CV_WINDOW_AUTOSIZE);
13     imshow(name, img);
14 }
15
16 int main()
17 {
18     Point2f p2(5, 1);
19     cout << p2 << endl;
20     Point3f p3(2, 6, 7);
21     cout << p3 << endl;
22     vector<float> v;
23     v.push_back((float)CV_PI);
24     v.push_back(2);
25     v.push_back(3.01f);
26     cout << Mat(v) << endl;
27     vector<Point2f> vPoints(20);
28     for (size_t i = 0; i < vPoints.size(); ++i)
29         vPoints[i] = Point2f((float)(i * 5), (float)(i % 7));
30     cout << vPoints << endl;
31     system("pause");
32     return 0;
33 }

计算算法运行时间:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4 #include <sstream>
 5
 6 //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 7
 8 using namespace std;
 9 using namespace cv;
10
11 void Show(std::string name,Mat img)
12 {
13     namedWindow(name, CV_WINDOW_AUTOSIZE);
14     imshow(name, img);
15 }
16
17 int main()
18 {
19     double t = getTickCount();
20     //do somethings
21     t = ((double)getTickCount() - t) / getTickFrequency();
22     cout << t << endl;
23     system("pause");
24     return 0;
25 }

下篇待续。。。

以上。

时间: 2024-08-06 02:15:50

OpenCV官方文档学习记录(1)的相关文章

OpenCV官方文档学习记录(4)

基本图形的绘制,官方文档给了一个实例,绘制下面两幅图形,分别使用了圆,椭圆,矩形,多边形,线等构造. 主要是使我们了解到如何构建这些形状,以及如何使用两种数据类型Point和Scalar分别定义点和颜色: 先放图: 完整代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\

OpenCV官方文档学习记录(16)

Canny边缘检测 先不说函数作用,来代码: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 using namespace std; 8 u

OpenCV官方文档学习记录(11)

制作自己的filter, 主要使用filter2D函数: 先上代码: 1 #include "opencv2/opencv.hpp" 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 int main(void) 9 { 10 Mat src,dst; 11 12 Mat kernel; 13 Point anthor; 14 do

OpenCV官方文档学习记录(6)

离散傅里叶变换:DFT,文档p165 代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 #define NUMBER 20 8 9

OpenCV官方文档学习记录(5)

随机数生成类:RNG以及文字渲染 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 #define NUMBER 20 8 9 using na

OpenCV官方文档学习记录(15)

laplace边缘检测方式 不同于sobel的一阶导数式边缘检测,laplace算子是将图像的横纵都考虑进来的一种检测,主要使用的是二阶偏导数进行离散变换: 因为laplace也是使用分析梯度的方式进行变换,所以实际上调用的是sobel的方法.在上一篇上有体现,就是在两个方向上分别使用sobel计算结果. 代码如下: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5

OpenCV官方文档学习记录(19)

重映射(remapping) 主要涉及函数 remap 因为重映射函数所做的就是通过相应的矩阵参数,将原图像对应的像素点按照参数表达式重新排列到目标矩阵,所以通过不同的算法的描写可以形成许多操作: 1.保持原样: 1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"win

OpenCV官方文档学习记录(13)

sobel边缘检测(导数运算) 主要函数Sobel() 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 using namespace cv; 7 8 void showImg(const string &win_name,const Mat &img) 9 { 10 namedWindow(win_name

OpenCV官方文档学习记录(12)

构建边界: 因为做图像卷积的时候在图片边缘的像素按照公式是无法计算的,因此需要在边缘构建边界进行计算: 在opencv中构建边界的函数是:copyMakeBorder(src,dst,top,bottom,left,right,borderType,values); 先来代码: 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6