MAX78000板子上集成了一颗摄像头:CMOS VGA图像传感器(OVM769)。这颗摄像头非常的小,分辨率不算高,支持实时图像采集,适用于边缘AI视觉应用。该摄像头通过12位并行接口与MAX78000微控制器连接,可直接将图像数据传输至芯片内置的CNN加速器进行低功耗AI推理,常用于目标检测、分类及人脸识别等场景。
这次,尝试读取这颗摄像头的图像,并在TFT液晶屏上做显示。
第一步:首先创建工程,美信官方提供了很详实的例程,“MaximSDKExamplesMAX78000CameraIF”这个例程提供了使用摄像头的范例,所以这次以这个项目为基础实现自己的工程。
将“MaximSDKExamplesMAX78000CameraIF”项目导入eclipse,然后修改Makefile文件。

第二步:初始化屏幕。这里使用的屏幕是2.4寸SPI液晶屏模块240*320TFT模块ILI9341。具体驱动可以参考之前的帖子。
| MAX78000FTHR开发板管脚 | TFT屏幕管脚 | 说明 | 
GND  | GND | 电源负 | 
| 3V3 | VCC | 电源正 | 
| P0_7 | SCK | 4 线-SPI 串口时钟 | 
| P0_5 | SDI | 4 线-SPI 数据线 | 
| P0_19 | RESET | 显示屏驱动芯片选脚,低电平使能 | 
| P0_8 | DC | 4 线-SPI 数据/指令选择选择脚 | 
| P0_9 | BLK | 背光控制开关;低电平关闭背光 | 
| P0_11 | CS | 4 线-SPI 片选低电平有效 | 
	//打开TFT屏幕
	mxc_gpio_cfg_t tft_reset_pin = { MXC_GPIO0, MXC_GPIO_PIN_19,
			MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH };
	mxc_gpio_cfg_t tft_blen_pin = { MXC_GPIO0, MXC_GPIO_PIN_9,
			MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH };
	MXC_TFT_Init(MXC_SPI0, 1, &tft_reset_pin, &tft_blen_pin);
	MXC_TFT_SetRotation(ROTATE_90);
	MXC_TFT_SetForeGroundColor(WHITE); // set chars to white
	MXC_Delay(1000000);第三步:初始化摄像头。这里跟着例程做,摄像头有使用I2C协议,这里摄像头的I2C地址为“0X3C”。可以设置摄像头获取图像的信息,这里TFT屏幕分辨率为320X240,所以就设置摄像头的图像分辨率为320X240,使用RGB565编码,这样后期摄像头显示就不用转码了。
// Initialize the camera driver.
	camera_init(CAMERA_FREQ);
	printf("nnCamera Examplen");
	slaveAddress = camera_get_slave_address();
	printf("Camera I2C slave address: %02xn", slaveAddress);
// Obtain the manufacturer ID of the camera.
	ret = camera_get_manufacture_id(&id);
	if (ret != STATUS_OK) {
		printf("Error returned from reading camera id. Error %dn", ret);
		return -1;
	}
	printf("Camera ID detected: %04xn", id);
// Setup the camera image dimensions, pixel format and data acquiring details.
	ret = camera_setup(IMAGE_XRES, IMAGE_YRES, PIXFORMAT_RGB565, FIFO_FOUR_BYTE,
			STREAMING_DMA, dma_channel); // RGB565 stream
	if (ret != STATUS_OK) {
		printf("Error returned from setting up camera. Error %dn", ret);
		return -1;
	}
	MXC_Delay(SEC(1));
	camera_write_reg(0x11, 0xE); // can be set to 0xB in release mode ( -o2 )
// Start capturing a first camera image frame.
	printf("Startingn");
	camera_start_capture_image();第四步:将摄像头获取到的图片显示到TFT屏幕。工作流程为:摄像头采集图像——>将图像数据存放到DMA——>从DMA读取一行图像数据——>绘制屏幕上的一行——>循环读取DMA直至读取图片完成。
void process_img(void) {
	uint8_t *raw;
	uint32_t imgLen;
	uint32_t w, h;
// Get the details of the image from the camera driver.
	camera_get_image(&raw, &imgLen, &w, &h);
	uint8_t *data = NULL;
	utils_stream_img_to_pc_init(raw, imgLen, w, h, camera_get_pixel_format());
	for (int i = 0; i < h; i++) {
		// Wait until camera streaming buffer is full
		while ((data = get_camera_stream_buffer()) == NULL) {
			if (camera_is_image_rcv()) {
				break;
			}
		};
		MXC_TFT_ShowImageCameraRGB565(X_START, Y_START + i, data, w, 1);
		release_camera_stream_buffer();
	}
	stream_stat_t *stat = get_camera_stream_statistic();
	if (stat->overflow_count > 0) {
		LED_On(LED_RED); // Turn on red LED if overflow detected
		while (1) {
		}
	}
}效果:



可以看出,屏幕能将摄像头获得的图片展示出来了。但是分辨率比较低,屏幕刷新很慢,可以看见明显的一帧一帧的图片更新,不确定是屏幕显示慢还是摄像头获取图片的速度慢。
			
			
			
						
			
 我要赚赏金
