python3 OpenCv 图像和原始字节之间的转换

1.概念

(1).一个字节能表示0-255的整数,一个像素通常由每个通道的一个字节表示.

(2).一个OpenCV图像时.array类型的二位或者三维数组.8位的灰度图像是一个含有字节值的二维数组.一个24位的BGR图像是一个三维数组,它也包含了字节值.

2.代码      其他的信息都在注释里

import cv2 as cv
import numpy
import os
img=cv.imread('timg.jpg')
#生成一个120,000字节的随机字节
#一个像素是一个字节,8位
randomByteArray=bytearray(os.urandom(120000))
#print(randomByteArray)
#转换成numpy数组
flatNumpyArray=numpy.array(randomByteArray)
# print(flatNumpyArray)
#转换成400*300像素  数组 300行*400列  所以图片长点
img=flatNumpyArray.reshape(300,400)
print(img.shape)
#写出文件
cv.imwrite('randomGray.jpg',img)
#转换成100*400的有色图片 数组 400行*100列 3个通道 所以图片宽点
img=flatNumpyArray.reshape(400,100,3)
#写出文件
cv.imwrite('randomColor.jpg',img)

 3.注意

使用以下代码能更高效的生成随机numpy数组  上文使用的os.urandom()函数有助于展示原始字节的转换

numpy.random.randint(0,256,120000).reshape(300,400)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将OpenCV图像传递给STM32F103C8T6,您需要将图像数据转换为适合STM32F103C8T6处理的格式,并将其发送到STM32F103C8T6。 以下是一种可能的方法,其中使用了UART串口通信: 1. 在OpenCV中读取图像,并将其转换为灰度图像: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 2. 将灰度图像转换为一维数组: ```python # 将灰度图像转换为一维数组 gray_array = np.ravel(gray_img) ``` 3. 将一维数组转换字节串: ```python # 将一维数组转换字节串 gray_bytes = gray_array.astype(np.uint8).tobytes() ``` 4. 在STM32F103C8T6中接收字节串,并将其转换图像数组: ```c #include <stdio.h> #include "stm32f10x.h" #define IMG_WIDTH 640 #define IMG_HEIGHT 480 // 图像数组 uint8_t img_array[IMG_WIDTH * IMG_HEIGHT]; int main(void) { // 初始化串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); while (1) { // 接收字节串 uint8_t recv_bytes[IMG_WIDTH * IMG_HEIGHT]; for (int i = 0; i < IMG_WIDTH * IMG_HEIGHT; i++) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); recv_bytes[i] = USART_ReceiveData(USART1); } // 将字节转换图像数组 for (int i = 0; i < IMG_WIDTH * IMG_HEIGHT; i++) { img_array[i] = recv_bytes[i]; } // 处理图像数组 // ... // 发送处理后的图像数组 // ... } } ``` 请注意,此示例仅演示了如何将字节转换图像数组,您需要根据您的具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值