opencv简单操作(一)

图像转换灰度图片显示

在原有基础上新增一个mat变量存放灰度图,用cvtcolor转换从bgr到grey就行了。

复制代码
std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";

  Mat img = imread(Path);
  Mat gray;
  cvtColor(img, gray, COLOR_BGR2GRAY);
  if (img.empty()) {
    spdlog::error("读取图像失败: {}", Path);
    return 1;
  }
  imshow("OpenCV test2", gray);
  imshow("OpenCV test1", img);
  waitKey(0);

高斯模糊

把灰度图高斯模糊,核用7*7的,sigmax=5,sigmay=0

复制代码
 std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";

  Mat img = imread(Path);
  Mat gray,gaosimg;
  cvtColor(img, gray, COLOR_BGR2GRAY);
  GaussianBlur(gray,gaosimg,Size(7,7),5,0);
  if (img.empty()) {
    spdlog::error("读取图像失败: {}", Path);
    return 1;
  }
  imshow("OpenCV test2", gray);
  imshow("OpenCV test1", img);
  imshow("OpenCV test3",gaosimg);
  waitKey(0);

可以看到糊了点

边缘检测

常用的像canny边缘检测器,用canny函数把之前的高斯模糊图片提取,这里要调一下阈值显示更多的线条,看自己调整,我这里25-75差不多了

复制代码
std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";

  Mat img = imread(Path);
  Mat gray,gaosimg,cannyimg;
  cvtColor(img, gray, COLOR_BGR2GRAY);
  GaussianBlur(gray,gaosimg,Size(7,7),5,0);
  Canny(gaosimg,cannyimg,25,75);
  if (img.empty()) {
    spdlog::error("读取图像失败: {}", Path);
    return 1;
  }
  imshow("OpenCV test2", gray);
  //imshow("OpenCV test1", img);
  imshow("OpenCV test3",cannyimg);
  waitKey(0);

图像膨胀和图像腐蚀

这个功能是将边缘检测的线条如上面右边图加粗或变细。

加粗用的dilate函数,核kernel一般用3*3,也可以5*5,9*9(要是奇数)

复制代码
函数 dilate
提供者 "opencv2/imgproc.hpp"

→ void

参数:

InputArray src (aka const _InputArray &)
OutputArray dst (aka const _OutputArray &)
InputArray kernel (aka const _InputArray &)
Point anchor = Point(-1, -1) (aka Point_<int>)
int iterations = 1
int borderType = BORDER_CONSTANT
const Scalar & borderValue = morphologyDefaultBorderValue() (aka const Scalar_<double> &)
@brief 使用特定结构元素对图像进行膨胀操作。

\该函数利用指定的结构元素对源图像进行膨胀,该结构元素决定了取最大值的像素邻域形状: \[\texttt{dst} (x,y) =\max{{(x',y'): \texttt{element}(x',y') \neq 0}} \texttt{src}(x+x', y+y')\]\该函数支持原地操作模式。膨胀可多次应用(通过 iterations 参数)。对于多通道图像,每个通道独立处理。\

@param src 输入图像;通道数任意,但深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。

@param dst 输出图像,与 src 具有相同尺寸和类型。

@param kernel 用于膨胀的结构元素;若 element=Mat(),则使用一个3×3的矩形结构元素。可通过 #getStructuringElement 创建内核。

@param anchor 锚点在结构元素中的位置;默认值 (-1, -1)表示锚点位于结构元素的中心。

@param iterations 应用膨胀的次数。

@param borderType 像素外推方法,参见 #BorderTypes。#BORDER_WRAP不支持。

@param borderValue 常量边界情况下的边界值。

// In namespace cv
void dilate(InputArray src, OutputArray dst, InputArray kernel,
            Point anchor = Point(-1, -1), int iterations = 1,
            int borderType = BORDER_CONSTANT,
            const Scalar &borderValue = morphologyDefaultBorderValue())

std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";

  Mat img = imread(Path);
  Mat gray, gaosimg, cannyimg;
  cvtColor(img, gray, COLOR_BGR2GRAY);
  GaussianBlur(gray, gaosimg, Size(7, 7), 5, 0);
  Canny(gaosimg, cannyimg, 25, 75);
  Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
  dilate(cannyimg, cannyimg, kernel);

  if (img.empty()) {
    spdlog::error("读取图像失败: {}", Path);
    return 1;
  }
  imshow("OpenCV test2", gray);
  // imshow("OpenCV test1", img);
  imshow("OpenCV test3", cannyimg);
  waitKey(0);

erode是腐蚀函数,作用是将图像线条变细,用法同上。

调整图片大小

resize函数,第一个参数是输入图像,第二个参数是输出图像,第三个参数是size(大小)。

复制代码
std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";
  Mat img = imread(Path);
  if (img.empty()) {
    qDebug() << "读取图片失败";
    return -1;
  }
  Mat imgresize;
  resize(img, imgresize, Size(500, 500));
  imshow("imgresize", imgresize);
  waitKey(0);

调整后500*500,图片变小

当然也可以不使用精确像素缩小,size填空,后面加上xy的比例就行。

裁剪图片

画一个roi矩形,用这个矩形直接裁剪就行了

复制代码
std::string Path =
      "D:/Qttemp/OpencvStudy/chapter1/OpencvCourse/Resources/1.jpg";
  Mat img = imread(Path);
  if (img.empty()) {
    qDebug() << "读取图片失败";
    return -1;
  }
  Mat imgroi;
  imgroi = img(Rect(150, 280, 600, 1300));
  spdlog::info("img size: Size({}, {})", img.size().width, img.size().height);
  imshow("imgroi", imgroi);
  waitKey(0);

绘制图片

绘制一个红色的矩形

大小500*500,bgr三通道,颜色0,0,255

复制代码
 Mat img(500,500,CV_8UC3,Scalar(0,0,255));
  imshow("img", img);

  waitKey(0);

前者是roi方式,第二种是rectangle函数,参数是矩形左上角坐标和右下角坐标,颜色,粗细

白色的正方形就是的。

画圆形

用circle,参数第一个是输入图像,第二个是圆心在图像上的坐标,如果想要粗点也可以在最后面加上一个粗细的数字,如果想要实心圆可以加个FILLED参数。

复制代码
Mat img(500,500,CV_8UC3,Scalar(0,0,255));

  circle(img, Point(250,250), 100, Scalar(0,255,0));
  imshow("img", img);

  waitKey(0);

画直线

用line函数,参数是直线的两个点的坐标和颜色

复制代码
Mat img(500,500,CV_8UC3,Scalar(0,0,255));

  circle(img, Point(250,250), 100, Scalar(0,255,0));
  line(img, Point(0,0), Point(500,500), Scalar(0,255,0));
  line(img, Point(500,0), Point(0,500), Scalar(0,255,0));

  imshow("img", img);

  waitKey(0);

添加文字

复制代码
putText(img, "hello world", Point(100,100), FONT_HERSHEY_SIMPLEX, 2, Scalar(0,0,0),2);
相关推荐
Rain50915 分钟前
mini-cc 终端 UI:用 React 写 CLI 是什么体验
前端·人工智能·react.js·ui·架构·前端框架·ai编程
wu85877345721 分钟前
向量数据库不是银弹:从枚举漏检到 ReACT 多轮召回的实践路径
前端·数据库·react.js
古怪今人25 分钟前
[前端]HTML盒模型与尺寸,标准文档流,块级元素、内联元素和行内块,CSS选择器
前端·css
小雨下雨的雨1 小时前
基于鸿蒙PC Electron框架技术完成的表单验证技术详解
前端·javascript·华为·electron·前端框架·鸿蒙
提子拌饭1331 小时前
饮料含糖量查询应用 - 鸿蒙PC用Electron框架完整实现
前端·javascript·华为·electron·前端框架·鸿蒙
JustHappy1 小时前
古法编程秘籍(五):什么是进程和线程?从软件到 CPU 的一次完整旅程
前端·后端·代码规范
爱编程的小金1 小时前
前端请求库的下一个进化方向:从 Promise 到策略化
前端·alova·前端请求库·请求策略
hsg771 小时前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
珑墨1 小时前
前端 AI 开发通用skill
前端
kyriewen1 小时前
一个人+Cursor,7天上线付费小程序:第1天我就想放弃了
前端·微信小程序·cursor