- 博客(47)
- 资源 (2)
- 收藏
- 关注
原创 opencv 学习: 11 图片像素位置变换,以图片加水波纹特效为例
摘要 本文介绍了通过像素重映射实现图像特效的方法。该方法保持像素值不变,仅改变像素位置,适用于创建哈哈镜等简单特效或图像畸变矫正。实现过程包括:1)定义重映射矩阵存储新坐标;2)通过双重循环计算每个像素的位移位置;3)使用OpenCV的remap函数应用映射。示例代码展示了波浪效果实现,其中Y坐标按正弦函数周期性偏移。该方法采用向后映射技术,通过x和y两个浮点型映射矩阵完成图像变换。执行结果显示,原始图像成功转换为具有波浪形变的效果图。
2025-12-01 20:09:56
225
原创 centos-6.9 下编译安装 gcc-4.8.5
本文记录了在Linux系统上编译安装gcc-4.8.5的过程。主要内容包括:1) 从官方源下载gcc-4.8.5源码并解压;2) 安装必要的数学库依赖(GMP、MPFR和MPC);3) 配置编译选项,指定自定义安装路径;4) 使用make进行编译安装;5) 通过update-alternatives工具实现多版本gcc管理;6) 使用readelf查看程序编译时使用的gcc版本信息。文中还提供了详细的命令行操作步骤和注意事项,适合需要维护历史项目的开发人员参考。
2025-11-28 15:10:45
204
原创 win11 微软拼音,关闭烦人的 Tab 快捷键候选提示
微软拼音输入法在Linux命令补全时误触发搜索功能的问题及解决方案。问题表现为拼音输入状态下按Tab键会弹出建议词列表而非命令补全,若误按回车则会跳转浏览器搜索,严重影响操作流畅性。解决方法:1)通过输入法设置开启兼容模式,可改善界面风格;2)在高级设置中关闭"新词热词"和"候选"功能,但Tab快捷键仍可能触发询问弹窗。微软输入法的这一设计存在明显缺陷,用户即使关闭功能仍会被反复询问启用,严重影响使用体验。
2025-11-28 13:42:59
188
原创 opencv 学习: 10 图像的简单运算(2)
本文介绍了OpenCV中的图像操作符重载和通道处理技术。操作符重载部分包括比特位运算、比较操作符和矩阵计算,如矩阵相乘、转置、叉乘等,可简化图像处理代码实现。通道分离与合并部分详细讲解了cv::split和cv::merge方法的使用,通过分离图像通道单独处理后再合并,实现高效的通道级操作。示例代码展示了如何通过调整蓝色通道值来改变图像色调,并解释了防蓝光效果的实现原理。这些技术为图像处理提供了灵活高效的操作方式。
2025-11-27 15:39:26
382
原创 CPP 同名结构体的同名方法调用问题,违反单一定义规则(ODR)
摘要:在Ubuntu 20.04环境下使用g++ 9.4.0时,发现违反C++的One Definition Rule(ODR)导致未定义行为。通过最小示例复现问题:两个头文件(a.h和b.h)定义了同名结构体A但内容不同,当在不同编译单元中使用时,编译器会根据编译顺序选择其中一个定义,导致运行时行为不可预测(如数据成员访问错误)。解决方法包括:1)确保类型名称唯一;2)使用命名空间隔离同名类型。该问题凸显了ODR违规在编译时难以检测但会导致严重运行时问题的特性。
2025-11-27 13:57:58
372
原创 opencv 学习: 10 图像的简单运算
摘要:本文介绍了如何将图片视为矩阵进行四则运算,重点演示了OpenCV中的加法运算。通过cv::add和cv::addWeighted方法可实现图片叠加,后者支持权重参数调节。文章还展示了使用掩码(mask)进行局部区域运算的技巧,以及不同运算方式的视觉效果对比。此外,简要提及了OpenCV提供的其他运算方法,如subtract、absdiff、multiply等矩阵运算函数。所有运算都默认使用cv::saturate_cast确保像素值合法,并支持直接将输入图片作为输出参数以优化内存使用。
2025-11-25 20:13:46
652
原创 知识碎片:UTF-8的编码浅识
UTF-8是一种变长编码格式,使用1-4个字节表示字符。本文介绍了UTF-8的三种主要表示方式:十六进制编码(如0xE50x9B0xA2表示"团"字)、Unicode转义序列(\u56e2)和Unicode码点(U+56E2)。这些格式分别用于数据存储、编程语言和标准文档中。文章还提供了C++测试代码,能够将输入的UTF-8字符串转换为十六进制编码输出,帮助理解编码转换过程。不同表示方式本质上指代相同字符,只是应用场景不同。
2025-11-19 20:01:47
726
原创 知识碎片:WSL2 安装 centos6.9
在WSL2上安装CentOS 6.9遇到挂载失败问题,通过修改.wslconfig配置文件解决。具体方法是在用户目录下创建".wslconfig"文件,加入[wsl2] kernelCommandLine = vsyscall=emulate配置项,无需重启服务即可生效。该方案参考了CentOS 6.10在WSL2的安装经验。
2025-11-17 19:13:48
198
原创 opencv 学习: QA_02 什么是图像中的高频成分和低频成分
本文介绍了数字图像处理中的频率成分概念。高频成分指像素值急剧变化的部分,包含边缘、细节和噪声;低频成分则是变化缓慢的区域,对应平滑背景和大色块。通过傅里叶变换可将图像转换到频域,低频集中在频谱中心,高频分布在外围。文章还列举了实际应用,如锐化处理(减去低频)、边缘检测(高通滤波)等。理解频率成分有助于图像增强、去噪等处理,是图像分析的重要基础。
2025-11-14 14:52:45
650
原创 opencv 学习: QA_01 什么是图像锐化
图像锐化技术通过增强边缘和细节提升图像清晰度,主要使用特定的卷积核(如3×3矩阵)强调像素差异。OpenCV中可通过filter2D函数或手动遍历像素实现。锐化能改善边缘对比度,突出细节,但过度使用会增加噪声。该技术广泛应用于照片处理、医学影像、工业检测等领域,需根据具体需求调整参数以获得最佳效果。
2025-11-14 14:49:42
311
原创 opencv 学习: 09 邻近像素处理,以高通滤波图片锐化为例
本文介绍了图像锐化处理的基本原理和实现方法。图像锐化通过增加边缘对比度使图像更清晰,使用拉普拉斯算子(5倍中心像素减去四邻域像素)计算新像素值。文中提供了两种C++实现:v1版本使用直观但效率较低的at方法,v2版本采用指针操作提高效率,并处理了数据溢出问题。代码演示了如何跳过边缘像素并进行锐化计算,最终输出视觉上更清晰的图像。执行效果显示锐化后图像细节更突出,纹理更明显。
2025-11-14 14:24:19
231
原创 opencv 学习: 08 计算代码执行耗时
本文介绍了在图像处理中比较不同遍历方式效率的方法。可以通过OpenCV的cv::getTickCount()和cv::getTickFrequency()函数来测量代码执行时间,或者使用C++11的chrono库进行更精确的计时。文中提供了多种遍历图像像素的实现方式,包括指针遍历、at方法、迭代器和reshape方法,并比较了它们的性能差异。其中指针遍历通常效率最高,而at方法由于随机访问特性较慢。最后给出了一个保持原图不变的优化实现,演示了如何在处理图像时避免不必要的内存分配。这些方法可以帮助开发者找到性
2025-11-13 15:46:25
157
原创 opencv 学习: 07 使用迭代器 (iterator) 遍历像素
本文介绍了使用迭代器遍历OpenCV图像像素的方法。首先解释了迭代器在面向对象编程中的概念和作用,然后详细说明了OpenCV提供的cv::MatIterator_模板类的使用方法。文章给出了两种迭代器声明方式,并展示了一个完整的颜色量化处理示例代码。该代码通过迭代器遍历图像所有像素,对每个颜色通道进行均匀量化处理,最后保存输出图像。实现的关键点包括迭代器的声明、开始/结束位置的获取以及像素访问语法。示例程序可以通过命令行参数指定输入图像、量化级别和输出路径,并显示处理前后的图像对比。
2025-11-11 17:20:28
391
原创 opencv 学习: 06 使用指针遍历像素,以均匀颜色量化为例
本文介绍了图像处理中的均匀颜色量化方法,通过划分RGB空间为大小相等的立方体来减少颜色数量。主要实现方式包括:1)将像素通道值除以缩小倍数后取商并调整;2)使用取模运算;3)利用位运算(限制缩小倍数为2的n次幂时)。文章提供了OpenCV的C++实现代码,并比较了不同缩小倍数下的效果。均匀颜色量化虽实现简单、效率高,但可能导致重要颜色丢失和色带现象。该方法适用于降低图像处理复杂度,文中还涉及了图像存储格式、有效宽度等扩展知识。
2025-11-10 19:49:41
436
原创 opencv 学习: 05 像素操作
本文介绍了图像处理中基本的像素操作技术。首先解释了灰度图和彩色图的像素表示方法:灰度图每个像素是0-255的数值,彩色图则包含RGB三个通道。文章重点讲解了如何使用OpenCV的cv::Mat类高效访问和修改像素值,包括使用at()方法和cv::Mat_模板类的简化操作。通过实现椒盐噪声的示例代码,展示了如何随机选择像素并修改其值为纯白或纯黑。还讨论了图像参数传递的注意事项,即使用引用计数机制实现高效传递。最后给出了完整的C++代码实现,展示了如何为图像添加指定密度的椒盐噪声。
2025-11-07 18:01:45
927
原创 opencv 学习: 04 通过ROI处理图片局部数据,以添加水印为例
本文介绍了如何在OpenCV中定义和操作图像的感兴趣区域(ROI)。主要演示了两种定义ROI的方法:1)使用cv::Rect指定矩形区域的位置和大小;2)使用cv::Range选择行和列范围。通过在目标图像上创建ROI映射(cv::Mat对象),可以对指定区域进行修改而不影响其他部分。文中提供了完整代码示例,展示了如何将logo图像复制到目标图像的右下角ROI区域,并保存结果。该方法适用于图像处理中需要局部操作的应用场景。
2025-10-31 20:38:26
202
原创 opencv 学习: 03 初识 cv:Mat
OpenCV中的cv::Mat数据结构是图像处理的核心,它表示一个像素矩阵,包含了图像的所有信息。Mat对象分为属性部分(如尺寸、通道数)和数据块(像素数据本身)。该数据结构采用引用计数机制管理内存,通过显式调用copyTo()或clone()实现深拷贝,而默认赋值操作仅进行浅拷贝。本文通过代码示例展示了Mat的基本操作:读取图像、灰度转换、数据类型转换、图像创建和拷贝等,重点阐述了Mat的内存管理机制及其对图像处理效率的影响。掌握Mat数据结构特性是进行高效图像处理编程的关键。
2025-10-31 18:04:40
507
原创 opencv 学习: 02 初识图片处理
本文介绍了OpenCV图像处理的基本流程和简单操作。主要内容包括: 图片处理三步骤:读取图片(imread)、处理图片(flip等操作)、输出图片(imwrite) 图片显示与窗口事件处理:使用imshow显示图片,并通过setMouseCallback设置鼠标事件回调函数 简单图形绘制:演示了putText、circle、rectangle、line等基本绘图函数的使用 示例代码展示了完整的图片处理流程,包括读取图片、显示窗口、添加鼠标交互、图像翻转处理、结果显示和保存等功能,为OpenCV初学者提供了一
2025-10-30 18:50:13
145
原创 opencv 学习: 01 ubuntu20.04 下 opencv 4.12.0 源码编译
本文介绍了在Ubuntu 20.04系统下搭建OpenCV 4.12.0开发环境的过程。首先安装必要的编译工具(cmake、g++、unzip)和依赖库(libgtk2.0-dev),解决cv::imshow显示图片时的窗口支持问题。然后下载OpenCV源码并通过CMake配置编译环境,采用默认的Release构建类型,无需额外配置其他图片依赖库。编译过程详细记录了各种编译器测试结果,包括C/C++编译器特性检测和使用不同警告选项的测试情况。该环境可用于后续图像处理程序的开发工作。
2025-10-30 18:01:23
427
原创 C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0
摘要:项目从gcc 4.8.1迁移到6.1.0环境后,出现链接错误,报"undefined reference"涉及RdKafka和std::__cxx11::basic_string。经排查发现是C++ ABI兼容性问题,通过添加编译宏解决。问题与新旧编译器对std::string的实现差异有关,需进一步学习C++ ABI机制。参考知乎相关技术文章辅助定位。(123字)
2025-10-21 20:14:35
377
1
原创 sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
摘要:该代码存在临时变量使用问题,timer.getName()等方法返回的临时变量在sqlite3_bind_text绑定后立即销毁,导致数据库存储乱码。解决方法是将SQLITE_STATIC改为SQLITE_TRANSIENT,让SQLite复制数据而非直接引用指针。SQLITE_TRANSIENT能确保数据在SQLite使用期间保持有效,避免野指针问题。修改后代码正确处理了临时变量生命周期问题,保证了数据存储的可靠性。
2025-10-11 15:02:34
353
翻译 sqlite 使用: 02-核心对象与接口概念
SQLite核心API摘要:SQLite的核心操作围绕两个对象展开:数据库连接对象(sqlite3)和预处理语句对象(sqlite3_stmt)。主要操作流程包括:1)使用sqlite3_open()创建连接;2)通过sqlite3_prepare()将SQL文本转为预处理语句;3)用sqlite3_step()执行语句;4)查询时使用sqlite3_column()获取结果;5)最后用sqlite3_finalize()和sqlite3_close()释放资源。为提高效率,可通过sqlite3_reset
2025-10-11 10:27:41
25
原创 sqlite 使用: 01-源码编译与使用
本文介绍了SQLite C/C++接口的安装与使用。首先详细说明了在Ubuntu 20.04环境下下载、编译和安装SQLite的步骤,通过源码包安装并验证成功。随后提供了一个完整的C++示例程序,展示了如何通过SQLite API进行数据库连接、表的创建、数据的增删改查等基本操作。示例包含回调函数处理查询结果,并配套提供了Makefile编译脚本。该教程适合初学者快速上手SQLite的C/C++接口开发,为进一步学习SQLite编程打下基础。
2025-10-10 18:54:54
286
原创 glog使用: 07-错误信号处理(Failure Signal Handler)
摘要:本文介绍了如何使用glog库的InstallFailureSignalHandler()函数安装信号处理程序,在程序崩溃时输出调试信息。通过示例代码演示了默认情况下将错误信息输出到标准错误,以及通过InstallFailureWriter()自定义错误输出方式。当程序发生段错误(SIGSEGV)时,会输出时间戳、调用栈等调试信息,帮助定位问题。自定义输出方式可将错误信息写入日志文件,但会改变原有错误信息的格式。
2025-09-23 19:49:43
289
2
原创 glog 使用: 06-自定义日志前缀格式(Custom Log Prefix Format)
文章摘要:介绍了如何在glog日志库中使用自定义回调函数格式化日志前缀。需要在编译时启用WITH_CUSTOM_PREFIX标志(默认已开启),包含GLOG_CUSTOM_PREFIX_SUPPORT宏后,实现CustomPrefix函数处理输出格式。示例展示了如何输出包含时间、线程ID、文件名等信息的标准格式前缀,并演示了初始化及使用LOG(INFO)输出日志的过程。最终日志格式与glog默认格式一致,包含详细的时间戳和代码位置信息。
2025-09-22 15:56:48
201
原创 glog 使用: 05-详细日志控制(Verbose Logging)
本文介绍了使用VLOG宏实现精细化控制日志输出层级的方法。VLOG支持设置详细级别,通过--v参数控制输出范围,值越大日志越详细。与严重级别相反,VLOG的级别数值越小越容易输出。文章还说明了如何通过命令行参数和环境变量按模块控制日志输出,包括使用--vmodule和GLOG_vmodule指定不同文件的输出级别。此外,介绍了VLOG_IS_ON条件宏和VLOG_IF等变体宏的使用方法,它们可以根据条件或频率输出详细日志。这些功能可帮助开发者在调试时获取详细日志,而在日常运行时减少不必要的信息输出。
2025-09-17 13:53:00
485
原创 glog 使用: 04-CHECK 宏(CHECK Macros)
本文介绍了CHECK宏及其变体在错误检查中的应用。CHECK宏用于验证条件,若不满足则终止程序并输出错误和堆栈信息,且不受NDEBUG影响。文章详细说明了各类CHECK宏:包括比较宏(CHECK_EQ/NE等)、指针检查宏(CHECK_NOTNULL)、字符串比较宏(CHECK_STREQ等)和浮点数比较宏(CHECK_DOUBLE_EQ/NEAR)。特别强调了指针比较时的NULL处理注意事项,并指出CHECK_NOTNULL可返回指针用于构造函数初始化。这些宏能确保参数只求值一次,支持临时表达式,并提供精
2025-09-12 15:39:07
426
原创 glog 使用: 03-条件日志(Conditional / Occasional Logging) 与 Debug模式日志 (Debug Mode Support)
本文介绍了glog日志库的条件输出功能,包括LOG_IF(条件触发)、LOG_EVERY_N(间隔输出)、LOG_IF_EVERY_N(条件间隔输出)、LOG_FIRST_N(前N条输出)和LOG_EVERY_T(时间间隔输出)等控制方式。同时说明了调试模式日志输出控制,通过D前缀的日志函数和NDEBUG宏定义,可在debug模式输出调试日志,非debug模式下自动失效,避免性能损耗。这些功能提供了灵活的日志输出控制机制。
2025-09-11 13:53:10
229
原创 glog 使用: 02-标识设置
本文介绍了设置glog日志输出行为的两种方式:启动参数和代码设置。启动参数可通过gflags参数(如--logtostderr=1)或环境变量(如GLOG_logtostderr=1)设置,包括logtostderr、stderrthreshold等常用参数。代码设置则通过修改FLAGS_*全局变量实现,但部分标志(如log_dir)需在InitGoogleLogging前设置。两种方式均可控制日志输出级别、目标等行为,满足不同场景需求。
2025-09-10 17:39:39
384
原创 glog 使用: 01-日志分级
本文介绍了Google开源日志库glog在CentOS 7.9环境下的基本使用,重点说明日志分级和最小输出日志等级功能。glog提供四种日志级别:INFO、WARNING、ERROR和FATAL,其中FATAL级别会导致程序终止并生成core文件。日志默认输出到stderr和/tmp目录下的文件,且高等级日志会包含低等级内容。通过设置FLAGS_minloglevel参数(0-3对应不同级别)可控制最小输出日志等级,仅输出大于等于该等级的日志。文中还提供了配置core文件生成的方法。
2025-09-08 17:10:08
368
原创 glog 使用: 00-源码编译
摘要:本文记录了在CentOS 7.9环境下编译安装glog 0.6.0的全过程。由于系统环境限制(gcc 6.1.0),作者详细说明了各组件版本的选择原因:glog 0.6.0适配gcc 6.1.0,cmake 3.23与glog兼容。主要内容包括:1)gcc 6.1.0源码编译安装;2)使用update-alternatives管理多版本gcc;3)cmake 3.23的二进制安装;4)glog 0.6.0的编译安装步骤。文章特别强调了版本兼容性问题,并提供了实际编译过程中的问题解决方案。
2025-09-05 20:07:59
531
原创 高压工程师的长寿秘诀:高效工作与健康平衡
摘要: 如何在高压技术岗位保持身心健康?关键在于构建"可持续发展"系统。认知层面需使命驱动,划清工作与生活界限;行动上优先睡眠(≥7小时)、规律运动(有氧+力量训练)、主动休息(冥想/散步)与健康饮食;工作技巧包括极致专注(番茄工作法)、自动化流程和有效沟通;环境选择应倾向健康文化的团队。这些策略非但不会降低效率,反而能提升持久创造力,助你成为更快乐、更高效的技术人才。身心健康是人生最重要的系统架构,而你是自己的首席架构师。
2025-08-20 11:01:54
786
1
原创 Qt 从剪贴板获取网页标题
本文介绍了,windows 下 使用 Qt 获取,通过从浏览器地址栏复制 URL 网址后,获取浏览器同时写到剪贴板中的对应网页标题的方式。
2023-11-07 17:01:02
252
原创 福昕阅读器命令行使用
但是并不好用,总不能每次看完文档都手动记一下读到那一页了吧。而且想把整个pdf工具整合到工作流里。福昕阅读器有相关的SDK,但是是收费的,个人只能另寻他路了。最后使用了SumatraPDF这个工具。开源,免费,轻量。自身就可以保存阅读进度,而且命令行也支持。集成到工作流挺适合。
2023-06-25 17:51:53
1036
2
转载 软件需求说明
软件需求说明书1 引言1.1 编写目的:阐明编写需求说明书的目的,指明读者对象。1.2 项目背景:应包括项目的委托单位、开发单位和主管部门;该软件系统与其他系统的关系。1.3 定义:列出文档中所用到的专门术语的定义和缩写词的愿文。1.4 参考资料:可包括项目经核准的计划任务书、合同或上级机关的批文文档所引用的资料、规范等列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源2 任
2017-04-17 14:38:32
1014
转载 项目开发计划模板
项目开发计划1 引言1.1 编写目的:阐明编写可行性研究报告的目的,提出读者对象1.2 项目背景:应包括项目的委托单位、开发单位和主管部门;该软件系统与其他系统的关系。1.3 定义:列出文档中用到的专门术语的定义和缩写词的原文1.4 参考资料:可包括:项目经核准的计划任务书、合同或上级机关的批文文档所引用的资料、规范等列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源;2 项
2017-04-17 14:36:59
13014
转载 软件开发流程
软件工程文档编写标准包括哪些内容在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、
2017-04-17 14:35:34
568
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅