OpenCV C++ 学习笔记(一)
OpenCV C++ 学习笔记(一)
写在前面
- 网络上OpenCV C++ 的学习笔记相对Python比较少
- 目的是记录学习过程同时希望能给到正在学习的朋友帮助
- 大部分是参考官方教程 强烈推荐官方文档
- OpenCV documentation index
安装
- OpenCV库直接安装就行, 双击安装->选择安装目录->安装
在VS中使用
-
新建VS工程
-
右键属性 -> C/C++ -> 常规 -> 附加包含库目录 -> opencv的安装路径(如 D:\opencv\build\include)
-
导入库:右键属性 -> 链接器 -> 常规 -> 附加库目录 -> 选择
opencv build
目录下/x64/vc16/lib
对应.lib
(如:D:/opencv/build/x64/vc16/lib/opencv_world470d.lib
) -
也可以使用
#pragma
#pragma comment(lib,"D:/opencv/build/x64/vc16/lib/opencv_world470d.lib")
-
还需要注意一个vs 版本
-
一些说明
-
opencv 安装后是可以通过配置环境变量改变 让使用变得更简单方便的
-
但个人更倾向与手动配置 并且写在明处更容易看到的地方 方便后期拷贝到其它地方编译使用
可参考官方用法
一些小栗子
- 图像变换
void example1()
{
// 读取图像
//cv::Mat img = cv::imread("./wallhaven-6oe337_1920x1080.png");
cv::Mat img = cv::imread("image/lena.jpg");
// 如果加入了opencv路径 OPENCV_SAMPLES_DATA_PATH 可直接使用下方法
//cv::Mat img = cv::imread(cv::samples::findFile("lena.jpg",true,true));
if (img.empty())
{
std::cout << "imread image is empty";
return;
}
cv::Mat gray,hsv;
// 图像变换
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);
namedWindow("Original");
// 显示图片
cv::imshow("Original", img);
// Gray
cv::imshow("Gray", gray);
cv::imshow("Hsv", hsv);
// 等待任意按键按下 阻塞程序
cv::waitKey(0);
// 释放所有窗口
cv::destroyAllWindows();
}
- 修改对比度和亮度
// 设置对比度、亮度 g(i,j)=α⋅f(i,j)+β :
void example5()
{
Mat img = imread("image/lena.jpg");
if (img.empty())
{
std::cout << "image is empty" << std::endl;
return;
}
Mat new_img = Mat::zeros(img.size(), img.type());
double alpha = 3.0; // Contrast 对比度 [1.0-3.0]
int beta = 0; // Brightness 亮度 [0-100]
for (int y = 0; y < img.rows; y++) {
for (int x = 0; x < img.cols; x++) {
for (int c = 0; c < img.channels(); c++) {
new_img.at<Vec3b>(y, x)[c] =
saturate_cast<uchar>(alpha * img.at<Vec3b>(y, x)[c] + beta);
}
}
}
imshow("Original Image",img);
imshow("New Image", new_img);
waitKey(0);
destroyAllWindows();
return;
}
- 离散傅里叶变换
void example6()
{
Mat I = imread("image/lena.jpg", IMREAD_GRAYSCALE);
if (I.empty())
{
std::cout << "imread Falid";
return;
}
// 输入图像展开最佳大小
Mat padded;
int m = getOptimalDFTSize(I.rows); // 获取最佳DFT点数 一般是 2^N 且>= inputcount
int n = getOptimalDFTSize(I.cols);
// 按最佳DFT点数调整图像 并在周边填充0
copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
// 创建两个数组作为复数 虚部用0填充
Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) };
Mat complexI;
// 将多个单通道数组创建为一个多通道数组
merge(planes, 2, complexI);
// 离散傅里叶变换 in-place
dft(complexI, complexI);
// compute the magnitude and switch to logarithmic scale
// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
split(complexI, planes); // merge的反向操作
// 计算幅度 dst(I)= sqrt(x(I)^2+y(I)^2)
magnitude(planes[0], planes[1], planes[0]);
Mat magI = planes[0];
// 对幅度 求log10 +1是避免出现log(0)
magI += Scalar::all(1);
log(magI, magI);
normalize(magI, magI, 0, 1, NORM_MINMAX);
imshow("magI",magI);
// 如果频谱的行或列数为奇数,则对其进行裁剪
magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
int cx = magI.cols / 2;
int cy = magI.rows / 2;
Mat q0(magI, Rect(0, 0, cx, cy)); //左上
Mat q1(magI, Rect(cx, 0, cx, cy)); //右上
Mat q2(magI, Rect(0, cy, cx, cy)); // 左下
Mat q3(magI, Rect(cx, cy, cx, cy)); // 右下
Mat tmp;
q0.copyTo(tmp); //交换象限(左上右下)
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp); //交换象限(右上与左下)
q2.copyTo(q1);
tmp.copyTo(q2);
imshow("Input Image", I);
imshow("Spectrum magintude", magI);
waitKey(0);
destroyAllWindows();
}
参考
原文地址:https://blog.csdn.net/weixin_49500446/article/details/137696342
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!