OpenCV是知名的跨平台计算机视觉库。它轻量级而且高效,提供了多个语言接口。,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用得比较多的接口是C++和Python的。这里以C++为例子。
在Linux系统下安装是非常方便的,下载安装包,命令行make
,make install
即可,具体不介绍。
使用也很方便,如果不希望每一次都输g++
和链接库的命令,可以采用CLion下编辑CMakeLists.txt
的方法。只需要加上:
set(OpenCV_DIR "/usr/local/share/OpenCV/OpenCVConfig.cmake")
find_package(OpenCV 3 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(temp main.cpp)
target_link_libraries(temp ${OpenCV_LIBS})
这么几句(注意第一行换成你自己安装好的OpenCVConfig.cmake
的路径!以及add_executable一定要放在target_link_libraries前面,否则会出错)。就可以一劳永逸了。
开始编写代码,首先包含头文件:
#include <opencv/cv.hpp>
#include <opencv/highgui.h>
#include <cmath>
using namespace cv;
第二步是百度一个比较好看的心形线,我找到的是这个方程式:
大概在区间能形成一个优雅的爱心。
编写check
函数来判断一个坐标在爱心里面还是外面:
bool check(double x, double y) {
return pow(x * x + y * y - 1, 3.0) + x * x * x * y * y < 0;
}
接下来准备画图。选用的是BGR三通道格式。这样的图片可以表示成的二维矩阵。是因为每个原色的存储需要一个uchar
类型()的整形数。我们定义好三个的数组表示每个坐标下对应原色的数值。
const int M = 400, N = 400;
int B[M][N], G[M][N], R[M][N];
遍历每个整数坐标,映射到区间后调用check
,并赋予对应的颜色:
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++)
if (check( (double) i / M * 3 - 1.5,(double) j / N * 3 - 1.5)) {
B[i][j] = abs(166 - i / 2);
G[i][j] = abs(83 - i / 2);
R[i][j] = abs(255 - i / 4 - j / 4);
} else
B[i][j] = G[i][j] = R[i][j] = 255;
}
注意这里的具体值是我瞎摸乱撞跟着效果和审美设定的,并无特殊规则,只是稍微有渐变的感觉。
然后我们构造OpenCV
的一个Mat
矩阵:
Mat Pic = Mat(M, N, CV_8UC3);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++) {
Pic.ptr<uchar>(i)[j * 3] = B[i][j];
Pic.ptr<uchar>(i)[j * 3 + 1] = G[i][j];
Pic.ptr<uchar>(i)[j * 3 + 2] = R[i][j];
}
最后我们定义一下窗体的标题,显示爱心。
cvNamedWindow("给可爱的人~(*@ο@*)");
imshow("给可爱的人~(*@ο@*)", Pic);
for (int i = 0; i < 4; i++)
waitKey();
大功告成~效果如下: