STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示

这篇具有很好参考价值的文章主要介绍了STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32连接OV2640 视频源接入到PyQt5界面中
作为AI模型的输入,视频流是非常重要的。在本文中,我们将介绍如何将STM32连接到OV2640摄像头,并将视频流接入到PyQt5界面中。

硬件连接
首先,我们需要将OV2640摄像头连接到STM32上。我们可以使用以下连接方式:

OV2640 | STM32 ------|------ SIOC | PB8 SIOD | PB9 XCLK | PA8 PCLK | PA6 VSYNC | PA4 HREF | PA7 D0 | PC0 D1 | PC1 D2 | PC2 D3 | PC3 D4 | PC4 D5 | PB6 D6 | PB7 D7 | PA9

STM32代码
接下来,我们需要编写STM32代码来控制OV2640摄像头并将视频流传输到PC。我们可以使用以下代码:

#include “stm32f4xx.h”
#include “stm32f4xx_gpio.h”
#include “stm32f4xx_rcc.h”
#include “stm32f4xx_dma.h”
#include “stm32f4xx_dcmi.h”

#define BUFFER_SIZE 3202402

uint8_t buffer[BUFFER_SIZE];

void DCMI_Config(void)
{
DCMI_InitTypeDef DCMI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_DCMI);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOB, &GPIO_InitStructure);

DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
DCMI_Init(&DCMI_InitStructure);

DMA_InitStructure.DMA_Channel = DMA_Channel_1;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DCMI->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);

DCMI_Cmd(ENABLE);
DMA_Cmd(DMA2_Stream1, ENABLE);
DCMI_CaptureCmd(ENABLE);

}

int main(void)
{
DCMI_Config();

while (1)
{
}

}
PyQt5代码
最后,我们需要编写PyQt5代码来接收STM32传输的视频流并将其显示在界面上。我们可以使用以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
import serial

ser = serial.Serial(‘COM3’, 115200)

class App(QWidget):
def init(self):
super().init()
self.title = ‘STM32 Video Stream’
self.left = 100
self.top = 100
self.width = 320
self.height = 240
self.initUI()

def initUI(self):
    self.setWindowTitle(self.title)
    self.setGeometry(self.left, self.top, self.width, self.height)

    self.label = QLabel(self)
    self.label.setGeometry(0, 0, self.width, self.height)

    self.timer = QTimer(self)
    self.timer.timeout.connect(self.update_frame)
    self.timer.start(1)

    self.show()

def update_frame(self):
    if ser.in_waiting > 0:
        data = ser.read(320*240*2)
        img = QImage(data, 320, 240, QImage.Format_RGB16)
        pixmap = QPixmap.fromImage(img)
        self.label.setPixmap(pixmap)

if name == ‘main’:
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
在这个例子中,我们使用了PyQt5的QLabel控件来显示视频流。我们还使用了一个定时器来定期更新视频流。最后,我们使用串口连接STM32并接收视频流。

总结

在本文中,我们介绍了如何将STM32连接到OV2640摄像头,并将视频流接入到PyQt5界面中。这个例子可以帮助你了解如何使用STM32控制外设,并将数据传输到PC。

如果使用MQTT的方式进行视频流的传输
如果使用MQTT的方式进行视频流的传输,可以使用MQTT协议的发布/订阅模式。具体步骤如下:

在STM32上编写代码,将视频流转换为二进制数据,并使用MQTT协议将数据发布到MQTT服务器上。

在PC端编写代码,使用MQTT协议从MQTT服务器上订阅视频流数据,并将数据转换为视频流进行显示。

下面是一个简单的示例代码:

STM32代码:

#include “stm32f4xx.h”
#include “stm32f4xx_gpio.h”
#include “stm32f4xx_rcc.h”
#include “stm32f4xx_dma.h”
#include “stm32f4xx_dcmi.h”
#include “MQTTClient.h”

#define BUFFER_SIZE 3202402

uint8_t buffer[BUFFER_SIZE];

void DCMI_Config(void)
{
DCMI_InitTypeDef DCMI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_DCMI);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_DCMI);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOB, &GPIO_InitStructure);

DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;
DCMI_Init(&DCMI_InitStructure);

DMA_InitStructure.DMA_Channel = DMA_Channel_1;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DCMI->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);

DCMI_Cmd(ENABLE);
DMA_Cmd(DMA2_Stream1, ENABLE);
DCMI_CaptureCmd(ENABLE);

}

int main(void)
{
DCMI_Config();

Network network;
MQTTClient client;
NetworkInit(&network);
MQTTClientInit(&client, &network, 30000, NULL, 0, NULL, 0);

char* address = "tcp://localhost:1883";
int rc = NetworkConnect(&network, address, 1883);
if (rc != 0) {
    printf("Failed to connect to MQTT broker: %d

", rc);
return -1;
}

MQTTMessage message;
message.qos = QOS0;
message.retained = 0;
message.payload = buffer;
message.payloadlen = BUFFER_SIZE;

while (1)
{
    rc = MQTTClientPublish(&client, "video_stream", &message);
    if (rc != 0) {
        printf("Failed to publish video stream: %d

", rc);
}
}
}
PC端代码:

import paho.mqtt.client as mqtt
import cv2
import numpy as np

def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(“video_stream”)

def on_message(client, userdata, msg):
data = np.frombuffer(msg.payload, dtype=np.uint8)
img = cv2.imdecode(data, cv2.IMREAD_COLOR)
cv2.imshow(“Video Stream”, img)
cv2.waitKey(1)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(“localhost”, 1883, 60)

while True:
client.loop_forever()
在这个例子中,我们使用了paho-mqtt库来实现MQTT协议的发布/订阅功能。在STM32代码中,我们使用了MQTTClient库来将视频流数据发布到MQTT服务器上。在PC端代码中,我们使用了OpenCV库来将二进制数据转换为视频流,并使用MQTT协议从MQTT服务器上订阅视频流数据。

总结

在本文中,我们介绍了如何使用MQTT协议进行视频流的传输。这个例子可以帮助你了解如何使用MQTT协议实现发布/订阅模式,并将视频流数据传输到PC端进行显示。文章来源地址https://www.toymoban.com/news/detail-460413.html

到了这里,关于STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)

    今天学习摄像头模块,使用该模块进行拍摄,照相等功能进行对stm32 控制板的结合,了解他的原理以及应用。 主角: ov7670摄像头模块。(大概了解一下产品背景)  OV7670 是 OV( OmniVision)公司生产的一颗 1/6 寸的 CMOS VGA 图像传 感器。该传感器体积小、工作电压低,提供单片

    2023年04月09日
    浏览(51)
  • 【FPGA】摄像头模块OV5640

    开发板:正点原子的达芬奇开发板(或MicroPhase的Z7-Lite 7020开发板) FPGA型号:XC7A35TFGG484-2(或XC7Z020CLG400-2) Vivado版本:2020.2 参考课程链接:正点原子手把手教你学FPGA-基于达芬奇开发板 A7 OV5640模块:正点原子ATK-OV5640   OV5640是OV(OMNIVISION)公司设计的一款CMOS图像传感器,

    2024年03月21日
    浏览(49)
  • RK3568驱动OV13850摄像头模组调试过程

    品牌:Omnivision 型号:CMK-OV13850 接口: MIPI 像素:1320W OV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素 CMOS图像传感器 ,使用OmniBSI+?技术提供了单-1320万像素(4224×3136)摄像头的功能。通过串行摄像头控制总线(SCCB)接口的控制,它提供了全帧、下采样、开窗的

    2023年04月27日
    浏览(53)
  • RK3568-android11-适配ov13850摄像头

    参考链接 相关概念 相关接口 相关协议 图像格式

    2024年02月09日
    浏览(74)
  • FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

    目录        前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作  SCCB时序特点 读写实现 OV7725寄存器常用配置参数              摄像头采集是图像处理的第一步,本章节分为多部分,旨在让大家学会如何使用OV7725采集图像,并且使用VGA协议显示出来。

    2023年04月08日
    浏览(54)
  • 基于ZYNQ的OV5640摄像头的sobel算子边缘检测

    最近鸽了挺久的,因为最近要做课设,再加上被这个工程的调试给难到了。 在做该工程的时候,有一个良好的项目管理习惯会让开发的时候不会让人那么的高血压。 特别要注意的是,异步FIFO的读写时钟的速率匹配问题,这个问题卡了我好久。 Sobel 算法是像素图像边缘检测中

    2024年01月20日
    浏览(42)
  • 基于RK3399 Android11适配OV13850 MIPI摄像头

      从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤MCLK使用的是GPIO3_B7 ⑥需要保证红色框框的供电电源正常。   结合RK提供的文档,如下摄像头数据采集拓扑图所示,我们

    2024年03月14日
    浏览(46)
  • OV5640 摄像头的图像拉普拉斯锐化处理和边缘提取

    如图所示,这是整个视频采集系统的原理框图。         上电初始,FPGA 需要通过 IIC 接口对 CMOS Sensor 进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的 FPGA 片内 ROM中。在初始化配置完成后,CMOS Sensor 就能够持续

    2024年02月01日
    浏览(54)
  • [022] [STM32] 使用DCMI(DVP)驱动OV2640

    OV2640为CMOS类型数字图像传感器,支持输出最大为200万像素(1600*1200分辨率)的图像,支持使用 VGA 时序输出图像数据,输出图像的数据格式支持YUV(422/420)、YCbCr422、RGB565以及JPEG格式,若直接输出JPEG格式的图像时可大大减少数据量。 可进行 图像补偿 :支持伽玛曲线、白平衡、

    2024年02月06日
    浏览(59)
  • MIPI摄像头工程=7系列FPGA + OV5640(MIPI) + 15 分钟 + VITIS

    硬件 Spartan-7 SP701 FPGA 7系列FPGA+电阻网络实现的MIPI接口 OV5640 MIPI接口 软件 AMD Vivado 2020 版本以上 AMD Vitis 2020 MIPI 接口现在非常流行,国产FPGA目前基本都带MIPI接口,而AMD-Xilinx是从U+系列开始支持MIPI电平,从国内使用情况来看,7系列FPGA是使用最广的器件,所以这次使用的FPGA是

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包