C++ OpenCV识别图像上的线条轨迹_c++实现低对比度图像线条或划伤检测-程序员宅基地

技术标签: C++ 基础  c++  opencv  

        如果图片上有线条,图形什么的,人的眼睛可以直接看出来,这是人的直接反应。那么如何让电脑识别呢?

        图片在内存中是以二维矩阵的形式存储的,如果是彩图,则是GBR三通道,灰度图则是单通道。本教程用OpenCV去识别图形上的线条,曲线等轨迹。

        软件环境:Win7-32, VS2010, OpenCV2.4.9

(1)以灰度图的方式导入图片

Mat src = imread("1.jpg", 0);

(2)我的思路:根据图形中的每个像素点的差异去判断,对原图的灰度图做二值化处理,不是线条的区域像素置0,有线条的区域置为255,然后逐列进行像素求和,如果列的和大于0则是检测到了线条,此时结束该列的扫描,继续扫描下一列。这样就可以得到线条的轨迹了。

      二值处理:

threshold(src, dst, 100, 255, CV_THRESH_BINARY_INV);  //二值化

      按列扫描求和:

//按列扫描,求像素和,由于是二值后的图片,没有线条时,该列的像素和为0;扫描到线条时像素大于0
	for(int w = 0; w < nCols; w++)
	{
		int sum = 0;
		
		for(int h = 0; h < nRows; h++)
		{
			uchar *pRow = dst.ptr<uchar>(h, w); //该列中每个像素的地址
			sum += (int)(*pRow);

			if(sum > 0)  //到达了线条的上侧,像素和大于0
			{
				cout << "找到了线条点,";   //从上往下找,由于线条很细,目前只判断上边界。
				cout << "坐标如下: X = " << w << ", Y = "  << h <<  endl;  
				fout << "坐标如下: X = " << w << ", Y = "  << h <<  endl; //控制台会丢失数据,存到文本不会丢失
				sum = 0;
				break;
			}
		}
	}

        整体代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <fstream>
using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("1.jpg", 0);
	//imshow("src", src);

	Mat dst;
	threshold(src, dst, 100, 255, CV_THRESH_BINARY_INV);  //二值化
	//imshow("dst", dst);

	int nRows = dst.rows;
	int nCols = dst.cols;

	ofstream fout("data.txt");

	//按列扫描,求像素和,由于是二值后的图片,没有线条时,该列的像素和为0;扫描到线条时像素大于0
	for(int w = 0; w < nCols; w++)
	{
		int sum = 0;
		
		for(int h = 0; h < nRows; h++)
		{
			uchar *pRow = dst.ptr<uchar>(h, w); //该列中每个像素的地址
			sum += (int)(*pRow);

			if(sum > 0)  //到达了线条的上侧,像素和大于0
			{
				cout << "找到了线条点,";   //从上往下找,由于线条很细,目前只判断上边界。
				cout << "坐标如下: X = " << w << ", Y = "  << h <<  endl;  
				fout << "坐标如下: X = " << w << ", Y = "  << h <<  endl; //控制台会丢失数据,存到文本不会丢失
				sum = 0;
				break;
			}
		}
	}

	waitKey();
	cout << endl;
	system("pause");
	return 0;
}

           在Qt中进行模拟,得到的如下结果:

            目前的识别如上所示,后续会继续更新,如有好的处理方法,请各位博友斧正。

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yao_hou/article/details/79320517

智能推荐

JVM原理讲解和调优_jvm原理及性能调优-程序员宅基地

文章浏览阅读881次。一、什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java_jvm原理及性能调优

社交网络分析重要概念简介、相关资料和前沿研究(持续更新ing...)_social network的bei 和ei-程序员宅基地

文章浏览阅读804次。社交网络分析重要概念简介、相关资料和前沿研究_social network的bei 和ei

pythontcp服务器框架_GitHub - xiaowang359/ChatServer: 基于python-tornado 与 sqlalchemy建立的1个TCP聊天服务器框架示例。...-程序员宅基地

文章浏览阅读140次。version 0.1 版本还存在一些BUG,采用sqlite数据库做为测试关于推送部分大家可以在pypi搜索anps 下载安装apnsclient 测试###通用部分提交length = json整体包长action = 协议关键字部分提交部分提交 uid ,为了使协议通用语web环境返回status = 状态成功失败errcode = 错误代码,需要具体定义common1000010001 ..._python tornado tcp 聊天

TensorFlow安装过程问题汇总_loading channels: failed-程序员宅基地

文章浏览阅读1.6k次。1. 问题: conda search numpy 以及 conda search --full-name python 失败。失败的现象:Loading channels: failedCondaHTTPError: HTTP 404 NOT FOUND for url <http://pypi.douban.com/simple/noarch/repodata.json>..._loading channels: failed

pip install sklearn安装成功后,提示ModuleNotFoundError: No module named ‘sklearn‘错误解决办法_pip sklearn库安装成功但是报错-程序员宅基地

文章浏览阅读6.5k次,点赞10次,收藏16次。pip install sklearn安装成功后,提示ModuleNotFoundError: No module named 'sklearn'错误解决办法_pip sklearn库安装成功但是报错

玩转传感器——DHT11温湿度传感器(STM32版)_温湿度传感器接线图-程序员宅基地

文章浏览阅读7.4w次,点赞327次,收藏2.3k次。玩转传感器——DHT11温湿度传感器(STM32版)文章目录玩转传感器——DHT11温湿度传感器(STM32版)前言一、接口说明1 接线图2 电源引脚3 串行接口(单线双向)二、通信过程三、测量分辨率与电气特性四、使用注意事项1 工作与贮存条件2 暴露在化学物质中3 恢复处理4 温度影响5 光线6 配线注意事项五、DHT11驱动程序1 DHT11.c1.1 配置输入输出GPIO1.2 复位DHT111.3 检查DHT11是否正常1.4 DHT11初始化1.5 读取一位数据(返回值0/1)1.6 读取一个_温湿度传感器接线图

随便推点

Anaconda创建Pytorch虚拟环境(排坑详细)_anaconda创建pytorch环境-程序员宅基地

文章浏览阅读5.9w次,点赞150次,收藏1.4k次。利用conda指令搭建Pytorch环境,并在Pytorch环境中安装GPU版Pytorch相关包。_anaconda创建pytorch环境

Linux: 磁盘状态观察命令lsblk、blkid-程序员宅基地

文章浏览阅读955次,点赞12次,收藏32次。有时我们在磁盘规划前会想要确定一下当前系统的文件系统或磁盘分区情况。这时,就有几个命令可以供选择,通过本文,可以学习这些命令的使用。_lsblk

构造方法与方法的区别详解_构造方法和普通方法之间的区别-程序员宅基地

文章浏览阅读5.7k次,点赞11次,收藏46次。结论!!!学生类当中虽然没有构造方法 但是测试代码当中Student对象也创建完成了。是因为当类中没有任何构造方法的时候系统默认构造一个无参数的构造方法构造方法和普通方法结构的区别如下:​​​​​​​调用构造方法怎么调用呢?..._构造方法和普通方法之间的区别

高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据...-程序员宅基地

文章浏览阅读199次。全文链接:http://tecdat.cn/?p=23378在本文中,我们将使用基因表达数据。这个数据集包含120个样本的200个基因的基因表达数据。这些数据来源于哺乳动物眼组织样本的微阵列实验(点击文末“阅读原文”获取完整代码数据)。相关视频1 介绍在本文中,我们将研究以下主题证明为什么低维预测模型在高维中会失败。进行主成分回归(PCR)。使用glmnet()进行岭回归、lasso 和弹性网el..._高维数据回归方法

中科数安 | 防泄密软件-程序员宅基地

文章浏览阅读419次,点赞16次,收藏3次。此外,中科数安防泄密软件还具有智能加密功能,可以识别散落在企业不同位置的机密文件,并对其强制加密,非核心数据不被过分加密,防止敏感内容泄漏。同时,它还支持离网办公,针对出差人员或网络故障等原因引起的客户端离网,用户可以发起离网审批,确保终端密文在出差过程中保持可用状态,不影响正常办公。它采用了多种加密机制和技术手段,确保企业数据的安全性、完整性和机密性。总之,中科数安防泄密软件是一种功能强大、技术先进的企业数据保护软件,可以有效地防止敏感数据的泄露和非法访问,保障企业的信息安全和业务连续性。

JavaScript——leetcode剑指 Offer 36. 二叉搜索树与双向链表_leetcode 链表的head是什么js-程序员宅基地

文章浏览阅读157次。题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需_leetcode 链表的head是什么js

推荐文章

热门文章

相关标签