K210_set_windowing(roi)_ROI列表无法设置x和y的问题

文章讲述了使用MaixbitK210摄像头时遇到的问题,即set_windowing函数中的ROI设置无效。解决方法包括物理调整摄像头位置和编程方式,如使用copy_to_fb和调整内存管理以减少图像变量。作者还讨论了预处理图像和不同图像格式对内存的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、现象

 

上面这张图是 320*240的原图数据

摄像头得到的QVGA/或其他更大的像素格式 的图像

 

上面这张是 set_windowing((224,224))

set_windowing((224,224)) 会导致 取到的是 左上角224*224的图像

ROI = (x,y,w,h)=(0,0,224,224)

根据set_windowing函数的声明,这时候通过设置ROI的x和y值 使 感兴趣区域 变为摄像头得到1的图像的中央

然而实际没有效果

结果搜索和技术支持的询问——maixbit自带的摄像头 的驱动 不支持 set_windowing函数中对ROI的x,y进行设置

二、解决办法

(一)物理解决办法,也是我在网上看到的大部分办法

将 k210摄像头的位置放在小车/云台中线偏右的地方 , 使模型的输入为小车正对着的数字

但是显然 误差很大

而且这样子能看到的范围很小,只能镜头的左上角看小车的正前方,而镜头右边的视野完全被set_window切割了

导致 小车在识别4个数字上 k210性能是足够识别4个,但是还是得一左一右两个k210来识别

(二)代码解决,网上没有,严重怀疑是我初创( )让我慰藉一下电赛前1.5个月都花在这个k210上面

(1)一开始的思路——除了set_windowing(roi),还有什么函数可以用

原则——我们是为了 预处理摄像头的图像 从而使模型的输入图像 是224*224 且是摄像头正对的图像,以摄像头为中线

img.copy(roi = (48,8,224,224))也可以设置输入图像的在摄像头源图像上的ROI

但是两者差别在哪呢?

set_windowing是sensor模块下的函数——即与摄像头有关,处理的是摄像头的图像

copy函数是ide带的对图像进行处理的函数——然而这里图像是由摄像头处理后的得到的

这有什么区别呢?

涉及到k210的存储系统

分为RGB565和888一个是pix格式,一个是给kpu处理的图像数据格式

然而如果是这样子写,会发现程序会在此处终止,结束执行,甚至k210会与ide断链

直接原因是 内存爆了

根本原因是 在图像处理的路上面 多了一个图片变量 而k210的内存本来就小,才8M吧

摄像头的照片 没试过能不能装在SD卡的区域内

但是没装sd卡也可以 处理摄像头照片且跑模型

解决办法就是 让这个路上只要有一个图像变量就行

    img = sensor.snapshot()
    img.copy(roi = (48,8,224,224),copy_to_fb = img)
    img.pix_to_ai()

#然后在输入图像给模型
    objects = kpu.run_yolo2(task, img)

后续还可以 通过 灰度图 来增快帧率

### 手写数字识别的技术方案及代码示例 手写数字识别是一项结合图像处理机器学习技术的任务,通常包括以下几个关键步骤:图像采集、预处理、特征提取以及模型预测。以下是具体的技术方案及代码示例。 #### 1. 图像采集与预处理 通过摄像头采集手写数字的图像后,需要对图像进行一系列预处理操作,例如二值化、形态学处理等[^2]。这些操作有助于突出数字区域并减少噪声干扰。 ```python import cv2 # 初始化摄像头 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break # 转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 二值化处理 _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 形态学操作(可选) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) binary = cv2.dilate(binary, kernel, iterations=1) # 显示结果 cv2.imshow("Binary Image", binary) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` #### 2. 数字区域提取 在预处理后的图像中,可以通过轮廓提取法或行列扫描法找到数字所在的感兴趣区域(ROI)[^2]。这一步对于后续的模型输入至关重要。 ```python # 寻找轮廓 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: x, y, w, h = cv2.boundingRect(contour) roi = binary[y:y+h, x:x+w] # 调整大小以适应模型输入 resized_roi = cv2.resize(roi, (28, 28)) # 可视化提取的数字 cv2.imshow("Extracted Digit", resized_roi) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 3. 模型训练与预测 使用深度学习框架(如TensorFlow或Keras)可以构建一个卷积神经网络(CNN)来完成手写数字的分类任务[^3]。以下是一个简单的MNIST数据集训练模型的示例: ```python import tensorflow as tf from tensorflow.keras import layers, models # 构建CNN模型 model = models.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0 # 训练模型 model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) # 保存模型 model.save("mnist_model.h5") ``` 在实际应用中,可以加载已训练好的模型并对提取的数字进行预测: ```python from tensorflow.keras.models import load_model # 加载模型 model = load_model("mnist_model.h5") # 对提取的数字进行预测 def predict_digit(image): image = image.reshape(1, 28, 28, 1).astype('float32') / 255.0 prediction = model.predict(image) return prediction.argmax() # 示例调用 predicted_label = predict_digit(resized_roi) print(f"Predicted digit: {predicted_label}") ``` #### 4. 嵌入式系统实现 如果需要将手写数字识别功能部署到嵌入式设备上,可以参考K210开发板的实现方法[^4]。以下是一个简化的代码示例: ```python import sensor, image, time, lcd from maix import KPU lcd.init(freq=15000000) sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) sensor.set_framesize(sensor.QVGA) sensor.set_windowing((224, 224)) sensor.skip_frames(time=1000) clock = time.clock() # 加载模型 kpu = KPU() kpu.load_kmodel("/path/to/mnist_model.kmodel") while True: clock.tick() img = sensor.snapshot() output = kpu.run(img) predicted_label = output.argmax() print(f"Predicted digit: {predicted_label}") lcd.display(img) ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值