当前位置: 首页 > news >正文

opencv 学习: 01 初识图片处理

1.图片读取与显示

就像计算机程序的基本数据处理过程一样:输入,处理,输出。

图片处理的过程也是一样:读取图片,处理图片,输出图片。

以下程序示例,实现这些最基本的操作:(增加了对原始图片和结果图片的展示)

#include <iostream>
#include <opencv2/opencv.hpp>int main(int argc, char* argv[]) {// 检查命令行参数if (argc != 3) {std::cerr << "Usage: " << argv[0] << " <input_image> <output_image>" << std::endl;return -1;}// [1] 读取输入图像 imread 完成对文件的读取,图片数据的解码,存放为 Mat 对象 这三个功能cv::Mat inputImage = cv::imread(argv[1]);if (inputImage.empty()) {std::cerr << "Error: Could not load image " << argv[1] << std::endl;return -1;}// [2] 显示原始图片cv::namedWindow("Input Image", cv::WINDOW_NORMAL);// 被显示的图片会经过一定的预处理,CV_16U和CV_32S 的像素值类型会被除以256.浮点型像素也会将 在 0.0 - 1.0之间的数据显示,小于 0 的显示黑色,大于1显示为白色。cv::imshow("Input Image", inputImage);// [3] 处理文档图像cv::Mat result;// 翻转图片 0 垂直翻转 1 水平翻转 -1 水平垂直翻转cv::flip(inputImage, result, 1);// [4] 显示处理结果cv::namedWindow("Output Image", cv::WINDOW_NORMAL);cv::imshow("Output Image", result);// [5] 保存结果 imwrite 完成对文件的写入,图片数据的编码,保存为文件if (!cv::imwrite(argv[2], result)) {std::cerr << "Error: Could not save image to " << argv[2] << std::endl;return -1;}std::cout << "Input image: " << argv[1] << std::endl;std::cout << "Output image: " << argv[2] << std::endl;// 等待窗口事件,而不是直接退出程序cv::waitKey(0);cv::destroyAllWindows();return 0;
}

2.highgui 鼠标事件回调与简单处理函数

2.1 highgui 鼠标事件回调

可以向对应窗口注册对应事件的回调函数,来对实现对应的交互事件逻辑。

以鼠标事件为例,先实现一个鼠标事件回调函数,然后将其设置为指定窗口的事件回调函数。

/*** @brief 鼠标回调函数,处理鼠标事件* @param event 鼠标事件类型,如点击、移动等* @param x 鼠标点击位置的x坐标* @param y 鼠标点击位置的y坐标* @param flags 鼠标事件相关的标志位 cv::MouseEventFlags常量之一。* @param userdata 用户自定义数据指针*/
void mouseCallback(int event, int x, int y, int flags, void* userdata) {}
...
别的代码
...
// 显示原始图片
cv::namedWindow("Input Image", cv::WINDOW_NORMAL);
// 设置鼠标回调函数
cv::setMouseCallback("Input Image", mouseCallback, reinterpret_cast<void*>(&inputImage));

2.2 简单处理函数

opencv提供了一些简单的方法,可以完成对图像的简单处理:

  • cv::flip(原始图片, 结果图片, 1) 翻转图片 0 垂直翻转 1 水平翻转 -1 水平垂直翻转 可以用原始图片对象,直接作为结果图片的传入。
  • 另外还有一些向图片上绘制文字图形的函数,可以在示例代码中查看使用方法。

完整示例代码:

#include <iostream>
#include <opencv2/opencv.hpp> 
#include "src/document_processor.h"// 获取当前时间字符串
std::string getCurrentTime() {time_t now = time(0);struct tm tstruct;char buf[80];tstruct = *localtime(&now);strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);return buf;
}/*** @brief 鼠标回调函数,处理鼠标事件* @param event 鼠标事件类型,如点击、移动等* @param x 鼠标点击位置的x坐标* @param y 鼠标点击位置的y坐标* @param flags 鼠标事件相关的标志位 cv::MouseEventFlags常量之一。* @param userdata 用户自定义数据指针* * 当用户左键点击时,输出点击位置坐标到控制台*/
void mouseCallback(int event, int x, int y, int flags, void* userdata) {cv::Mat* image = reinterpret_cast<cv::Mat*>(userdata); if(image == nullptr || image->empty()) return;if (event == cv::EVENT_LBUTTONDOWN) { //写几个字cv::putText(*image, "Time:" + getCurrentTime(), cv::Point(x, y), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);//画几个图形cv::circle(*image, cv::Point(x, y), 5, cv::Scalar(0, 0, 255), -1);cv::rectangle(*image, cv::Point(x - 5, y - 5), cv::Point(x + 5, y + 5), cv::Scalar(0, 255, 0), -1);cv::line(*image, cv::Point(x - 5, y - 5), cv::Point(x + 5, y + 5), cv::Scalar(255, 0, 0), 2);std::cout << "Mouse clicked at (" << x << ", " << y << ") flags:" << flags << " Pixel Value:" << static_cast<int>(image->at<uchar>(cv::Point(x,y))) << std::endl; //重绘,刷新显示cv::imshow("Input Image", *image);}
}int main(int argc, char* argv[]) {// 检查命令行参数if (argc != 3) {std::cerr << "Usage: " << argv[0] << " <input_image> <output_image>" << std::endl;return -1;}// 读取输入图像 imread 完成对文件的读取,图片数据的解码,存放为 Mat 对象 这三个功能cv::Mat inputImage = cv::imread(argv[1]);if (inputImage.empty()) {std::cerr << "Error: Could not load image " << argv[1] << std::endl;return -1;}//获取图片行数和列数std::cout << "Image rows: " << inputImage.rows << ", columns: " << inputImage.cols << std::endl;// 显示原始图片cv::namedWindow("Input Image", cv::WINDOW_NORMAL);// 设置鼠标回调函数cv::setMouseCallback("Input Image", mouseCallback, reinterpret_cast<void*>(&inputImage));// 被显示的图片会经过一定的预处理,CV_16U和CV_32S 的像素值类型会被除以256.浮点型像素也会将 在 0.0 - 1.0之间的数据显示,小于 0 的显示黑色,大于1显示为白色。cv::imshow("Input Image", inputImage);// 处理文档图像cv::Mat result;// 翻转图片 0 垂直翻转 1 水平翻转 -1 水平垂直翻转cv::flip(inputImage, result, 1);// 显示处理结果cv::namedWindow("Output Image", cv::WINDOW_NORMAL);cv::imshow("Output Image", result);// 保存结果 imwrite 完成对文件的写入,图片数据的编码,保存为文件if (!cv::imwrite(argv[2], result)) {std::cerr << "Error: Could not save image to " << argv[2] << std::endl;return -1;}std::cout << "Document processing completed successfully!" << std::endl;std::cout << "Input image: " << argv[1] << std::endl;std::cout << "Output image: " << argv[2] << std::endl;cv::waitKey(0);cv::destroyAllWindows();return 0;
}

结果:在鼠标点击位置处,会显示当前时间,并绘制几个图形和文字
在这里插入图片描述

http://www.dtcms.com/a/548892.html

相关文章:

  • 从 Wot UI 出发谈 VSCode 插件的自动化发布
  • Rust专项——用 Weak 打破引用环:树与图结构实战
  • c#调Lua返回个字符串
  • 单元测试(JUnit、Mockito、PowerMock )
  • 不只是语法糖:解构作为 Rust 安全与清晰度的基石
  • 企业微信消息群发助手(企业微信自建应用)winform.netcore实现(详细配置)
  • 基于Vue的教育学习网站04y8688l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 移动端网站生成器中国电商平台排行榜前100
  • Excel正则表达式.获取字符
  • K8s 资源管理与操作
  • 如何在 Azure 虚拟机上部署 Elasticsearch
  • Go切片的赋值
  • Go语言设计模式:原型模式详解
  • 泉州网站建设-泉州网站建设石家庄网站建设招聘
  • [MySQL]表——权限控制
  • 把AI“灌”进奶瓶:1KB决策树让婴儿温奶器自己学会「恒温+计时」
  • 视频网站怎么做移动广告联盟
  • 高速DIC技术用于无人机旋翼动态变形与轨迹姿态分析
  • Node.js环境变量配置
  • Docker 部署 Node.js + Playwright 项目,实现浏览器截图、打印和下载
  • 所有权与解构:一次把“拆”与“留”写进类型系统的旅程 ——从语法糖到零拷贝 AST
  • 基于ASM1042通信接口芯片的两轮车充电机性能优化研究
  • hadoop之MapReduce的map工作流程
  • 民治做网站公司门户网站开发要求
  • 设计师网站欣赏企业官网模板图下载
  • 图像与视频页面的数据提取:从OCR到关键帧抽取的一场“视觉接管”
  • 常州城乡建设学校网站上海自动seo
  • Android15 Camera系统调试操作
  • 建模工具Enterprise Architect:敏捷开发中的架构治理与迭代适配
  • [HDiffPatch] 补丁算法 | `patch_decompress_with_cache` | `getStreamClip` | RLE游程编码