驱动捉虫 摄像头模块输出图像或屏幕显示出现1像素等间隔水平或垂直条纹的原因以及解决方法

本文主要是介绍驱动捉虫 摄像头模块输出图像或屏幕显示出现1像素等间隔水平或垂直条纹的原因以及解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文所述的所谓条纹,并不是指杂色的条纹,而是观感上把图像割裂,让图像变模糊的条纹。这种模糊的条纹有可能在驱动类似ov2640这样的摄像头,或是MCU 8080接口的屏幕时出现。

 我保存了一帧有这个现象的摄像头采集回来的图片,如下图。可以看到,图片中竖向的内容像是被切开了,变得异常模糊。实际上在这个距离上320*240的分辨率还是可以看清楚字的。

采集到的一个问题图片

这种现象实际上是由于像素错位产生的。假设一共有8个像素,显示正常内容时,像素的排布方式应该如下所示

两行四列像素的正确排布
A0B0C0D0
A1B1C1D1

而产生这样现象的时候你看到的像素排列实际上是这样的:

你看到的实际的像素排布
B0A0D0C0
B1A1D1C1

即左右两个像素点的位置反了,所以看到的图像在观感上产生了竖直方向的条纹。有种被撕裂的感觉。那们这样的现象是如何产生的呢?

有些器件在对其通信方式进行配置的时候,可能选择了“字传送”的模式。即摄像头一次性发送32位数据或者MCU发送32位的数据至屏幕上。对于RGB565格式的数据帧来说,半字的数据刚好是一个像素。如果用一个字母代表一个半字的话,在内存中,他们可能乖巧地按照ABCD的顺序排列。可是当如果用一个字长度的指针访问它的起始地址的话,读出来一个字的内容就变成了BA,即原来第二个像素的数据变成了这个字的高16位。当发送方将这个字以MSB的形式发送的话。接收方按顺序收到的第一个数据实际上就是第二个像素的内容而不是第一个像素了。这样循环发送,整个画面上前后两个像素的内容就都发生了反转。

出现了这种问题应该怎么修复呢?

有两种方法可以参考,一种是用软件将相邻两个像素的数据进行调换,还有一种是更改数据发送方式的配置,让发送方半字半字地按顺序发送就可以了。

用软件地方式可能更简单一些,不需要深入研究数据传送的配置。这边附上一个将相邻半字数据调换的代码片段,方便大家快速验证自己碰到的是不是这样的问题。

//addr为图像数据的起始地址 resolution为图片像素
int exchang_pixel(uint16_t* addr,uint32_t resoltion)
{if(NULL == addr)return -1;uint16_t data = 0;for(int i = 0 ; i < resoltion ;i = i + 2){data = addr[i];addr[i] = addr[i + 1];addr[i + 1] = data;}return 0;
}

 

这篇关于驱动捉虫 摄像头模块输出图像或屏幕显示出现1像素等间隔水平或垂直条纹的原因以及解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484014

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.