jetson nano + IMX219采raw图

研究了一圈,想直接采集raw图,很难。淘宝上直接买的模组,几乎都是直接出isp过后的图,至少有个去马赛克的过程,这就很难采raw了。淘宝上几乎是只能定制。想不到,不需要isp功能的相机模组反而非常难找。通过开发板来做的话,也很少有相关资料,而且多数是数莓派的开发板的,没搞过这种板。研究了一下,用jetson nano应该也可以,以下的仅有的一些资料:

1,采raw同时马上转成Mat

2,在Jetson Nano平台上利用libargus控制树莓派相机模块拍照

 3,GitHub - zhaoxuhui/Jetpack-Argus-Demo-OneShot

资料1有提一下代码是怎么样采集到raw数据(没有保存raw图),资料2的整体的介绍,包括了最小工程建立,cmake怎么写之类,资料3是2的github代码。

实际操作的时候,是下载github代码为蓝本,参考资料1来改成拍raw的指令,并摸索raw的保存和imx219相机的图片buffer预处理,资料1中的相机是13.2m相机,pitch是8192,而我的相机是(3264+64)*2,且我的相机的pitch中没用的数据是放在前面的,他那个相机是放在后面的。这个64也是多次尝试后摸索出来的,不跳过pading的时候i,图片会乱码,同时会有一行一行很规律的黑线,这个黑线看起来差不多是64个像素,且是从头开始的。按理说imx最大像素是3280,减去3264,就是16了,不知道为什么是64,但实际上就是64有效,没具体研究。

附上我以资料三中main-all.cpp修改来的main-raw.cpp,其他部分模仿资料三就好了:

#include <stdio.h>
#include <stdlib.h>
#include <Argus/Argus.h>
#include <EGLStream/EGLStream.h>
#include <iostream>
#include<fstream>  
#include<iostream>  
#include<string>   
int main(int argc, char** argv)
{// step1 创建Argus环境Argus::UniqueObj<Argus::CameraProvider> cameraProvider(Argus::CameraProvider::create());Argus::ICameraProvider *iCameraProvider = Argus::interface_cast<Argus::ICameraProvider>(cameraProvider);// 信息输出std::cout<<"Step1: Create Argus Session and Get Camera Provider"<<std::endl;if(!iCameraProvider){std::cout<<"==>Cannot get core camera provider interface"<<std::endl<<std::endl;}else{std::cout<<"==>Argus Version:"<<iCameraProvider->getVersion().c_str()<<std::endl<<std::endl;}// step2 获取可用相机std::vector<Argus::CameraDevice*> cameraDevices;iCameraProvider->getCameraDevices(&cameraDevices);// 信息输出std::cout<<"Step2: Get Available Camera Devices by Camera Provider"<<std::endl;if(cameraDevices.size()==0){std::cout<<"==>No cameras available"<<std::endl<<std::endl;}else{std::cout<<"==>"<<cameraDevices.size()<<" Camera device(s) avaiable"<<std::endl<<std::endl;}// step3 获取相机属性接口Argus::ICameraProperties *iCameraProperties = Argus::interface_cast<Argus::ICameraProperties>(cameraDevices[0]);// 信息输出std::cout<<"Step3: Get Properties of Available Camera"<<std::endl;if(!iCameraProperties){std::cout<<"==>Failed to get iCameraProperties interface"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to get iCameraProperties interface"<<std::endl<<std::endl;}// step4 获取相机支持的拍摄模式并默认使用第一个拍摄std::vector<Argus::SensorMode*> sensorModes;iCameraProperties->getAllSensorModes(&sensorModes);Argus::ISensorMode *iSensorMode = Argus::interface_cast<Argus::ISensorMode>(sensorModes[0]);// 信息输出std::cout<<"Step4: Get Available Camera Modes"<<std::endl;if(sensorModes.size()==0){std::cout<<"==>Failed to get sensor modes"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to get sensor modes"<<std::endl;for (int i = 0; i < sensorModes.size(); ++i){Argus::ISensorMode *tmpSensorMode = Argus::interface_cast<Argus::ISensorMode>(sensorModes[i]);Argus::Size2D<uint32_t> resolution = tmpSensorMode->getResolution();std::cout<<"\tMode "<<i<<": Width="<<resolution.width()<<" Height="<<resolution.height()<<std::endl;}std::cout<<std::endl;}// Step5 创建Capture Session并获得控制接口Argus::Status status;Argus::UniqueObj<Argus::CaptureSession> captureSession(iCameraProvider->createCaptureSession(cameraDevices[0], &status));Argus::ICaptureSession *iSession = Argus::interface_cast<Argus::ICaptureSession>(captureSession);// 信息输出std::cout<<"Step5: Get the Interface of Capture Session"<<std::endl;if(status!=Argus::STATUS_OK){std::cout<<"==>Failed to get the interface of capture session"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to get the interface of capture session"<<std::endl<<std::endl;}// Step6 设置输出流参数Argus::UniqueObj<Argus::OutputStreamSettings> streamSettings(iSession->createOutputStreamSettings(Argus::STREAM_TYPE_EGL));Argus::IEGLOutputStreamSettings *iEGLStreamSettings = Argus::interface_cast<Argus::IEGLOutputStreamSettings>(streamSettings);iEGLStreamSettings->setPixelFormat(Argus::PIXEL_FMT_RAW16);//iEGLStreamSettings->setPixelFormat(Argus::PIXEL_FMT_YCbCr_420_888);iEGLStreamSettings->setResolution(iSensorMode->getResolution());iEGLStreamSettings->setMetadataEnable(true);// 信息输出std::cout<<"Step6: Set Parameters of Output Stream"<<std::endl;if(!iEGLStreamSettings){std::cout<<"==>Failed to set the parameters of output stream"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to set the parameters of output stream"<<std::endl<<std::endl;}// Step7 创建输出流Argus::UniqueObj<Argus::OutputStream> stream(iSession->createOutputStream(streamSettings.get()));// 信息输出std::cout<<"Step7: Create Output Stream Object"<<std::endl;if(!stream){std::cout<<"==>Failed to create output stream object"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to create output stream object"<<std::endl<<std::endl;}// Step8 创建Consumer对象并获取控制接口Argus::UniqueObj<EGLStream::FrameConsumer> consumer(EGLStream::FrameConsumer::create(stream.get()));EGLStream::IFrameConsumer *iFrameConsumer = Argus::interface_cast<EGLStream::IFrameConsumer>(consumer);// 信息输出std::cout<<"Step8: Create Consumer Object and Interface"<<std::endl;if(!iFrameConsumer){std::cout<<"==>Failed to create consumer object"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to create consumer object"<<std::endl<<std::endl;}// Step9 创建请求并与Stream关联Argus::UniqueObj<Argus::Request> request(iSession->createRequest(Argus::CAPTURE_INTENT_STILL_CAPTURE));Argus::IRequest *iRequest = Argus::interface_cast<Argus::IRequest>(request);status = iRequest->enableOutputStream(stream.get());// 信息输出std::cout<<"Step9: Create Request"<<std::endl;if(status!=Argus::STATUS_OK){std::cout<<"==>Failed to create request"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to create request"<<std::endl<<std::endl;}// Step10 设置拍摄的模式Argus::ISourceSettings *iSourceSettings = Argus::interface_cast<Argus::ISourceSettings>(request);iSourceSettings->setSensorMode(sensorModes[0]);uint32_t requestId = iSession->capture(request.get());// 信息输出std::cout<<"Step10: Set Sensor Mode"<<std::endl;if(!iSourceSettings){std::cout<<"==>Failed to set sensor mode"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to set sensor mode"<<std::endl<<std::endl;}// Step11 构造Frame对象并接收数据const uint64_t FIVE_SECONDS_IN_NANOSECONDS = 5000000000;Argus::UniqueObj<EGLStream::Frame> frame(iFrameConsumer->acquireFrame(FIVE_SECONDS_IN_NANOSECONDS, &status));EGLStream::IFrame *iFrame = Argus::interface_cast<EGLStream::IFrame>(frame);EGLStream::Image *image = iFrame->getImage();// 信息输出std::cout<<"Step11: Create Frame Object and Receive Data"<<std::endl;if(!image){std::cout<<"==>Failed to create frame object and receive data"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to create frame object and receive data"<<std::endl<<std::endl;}// Step12 构造JPEG对象//EGLStream::IImageJPEG *iImageJPEG = Argus::interface_cast<EGLStream::IImageJPEG>(image);//status = iImageJPEG->writeJPEG("argus_oneShot.jpg");EGLStream::IImage *iImage = Argus::interface_cast<EGLStream::IImage>(image);// 信息输出std::cout<<"Step12: Create image Object and Save Data"<<std::endl;if(!image){std::cout<<"==>Failed to create image object and save data"<<std::endl<<std::endl;}else{std::cout<<"==>Succeed to create image object and save data"<<std::endl<<std::endl;}//Argus::Size2D<uint16_t> size = iImage->getSize();//status = iImage->writeJPEG("argus_oneShot.raw");//EXIT_IF_NULL(iImage, "Failed to get iImage Interface");   //FILE *fpdst =  fopen("argus_oneShot.raw","wb");//std::cout<<(uint16_t*)iImage->mapBuffer()<<std::endl;//fwrite((uint16_t*)iImage->mapBuffer(),sizeof(uint16_t),3264*2464,fpdst);//fclose(fpdst);uint16_t* p_s = (uint16_t*)iImage->mapBuffer();Argus::Size2D<uint16_t> size = iImage->getBufferSize();int width = size.width() ;int height = size.height() ;//uint16_t numPlanes = size.getNumberOfPlanes() ; std::cout<<width<<std::endl; std::cout<<height<<std::endl; //std::cout<<numPlanes<<std::endl;uint16_t* p_d = new uint16_t[3264*2464];uint16_t* output_data = new uint16_t[3264*2464];size_t destIndex = 0;//uint16_t data_buff[3264*2464];uint16_t max_raW = 0;uint16_t max_tmp = 0;uint16_t max_d = 0;for(int y=0;y<2464;y++){p_s+=64;for(int x =0;x<3264;x++){
// imx219相机是10bit深度的图片,相机buffer内是14bit的,所以进行了移位运算,不知是不是驱动有bug的原因//std::cout<<*p_s<<std::endl;output_data[destIndex++] = *p_s>>4;p_s++;p_d++;}//p_s+=64;//很多相机是在这里放无用数据,但imx219不是}std::ofstream file ( "oneShot.raw",std::ios::out | std::ios::binary);file.write(reinterpret_cast<const char*>(output_data),sizeof(uint16_t)*3264*2464);////file.write((const char*)data_buff,sizeof(uint16_t)*3264*2464);//file.close();// 信息输出//std::cout<<"Step12: Create JPEG Object and Save Data"<<std::endl;//if(status!=Argus::STATUS_OK){//     std::cout<<"==>Failed to create jpeg object and save data"<<std::endl<<std::endl;// }else{//     std::cout<<"==>Succeed to create jpeg object and save data"<<std::endl<<std::endl;// }// Step13 关闭ArguscameraProvider.reset();// 信息输出std::cout<<"Step13: Shut Down Argus"<<std::endl;return 0;
}

 下面是经过了可视化之后的raw图,也没有做去马赛克之类,所以是黑白的模糊的,可视化原理非常简单,下面是可视化的python:

import numpy as np
import cv2x = 3264
y = 2464rawpath = "oneShot.raw"Bindata = np.fromfile(rawpath,dtype = 'uint16')max = 0
for i in range(x*y):#print(Bindata[i])if Bindata[i] > max:max = Bindata[i]print(max)Binimg = Bindata[0:x*y].reshape(y,x)
Mat_img = np.clip(Binimg/4,0,255.0).astype("uint8")
cv2.imwrite("oneShot_ir.jpg",Mat_img)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】交叉熵和MSE的理解

先说结论&#xff1a; 原来&#xff0c;他们与维度无关&#xff0c; 只要维度合适&#xff0c;都能计算。哈哈哈哈 测试代码&#xff1a; model Net(10,128,Config.num_output_feat)inputs torch.randn(3,5,10)res model(inputs)# 3X5print(res)label torch.randn(3,5)# lo…

高效开发与调试 RK3568 上的 Android 11:全面指南

目录 介绍环境准备1. 硬件准备2. 软件准备 环境搭建1. 下载并编译 Android 11 源码2. 烧写 Android 11 到 RK3568 高效开发与调试1. 使用 ADB 进行调试USB 连接无线调试 2. 使用 Android Studio 进行开发与调试配置 Android Studio使用 Logcat 查看日志断点调试 3. 使用其他工具…

【Android面试八股文】你能说说View的绘制流程是从Activity的哪个生命周期方法开始执行的?

文章目录 View绘制流程与Activity生命周期详细代码解释总结View绘制流程与Activity生命周期 在Android中,View的绘制流程确实与Activity的生命周期密切相关。 具体来说,视图的绘制通常会在onResume()之后开始,这意味着绘制过程正式启动是在Activity的onResume()方法完成后…

mysql数据库中给表创建数据

mysql数据库中给表创建数据 1、操作流程 1、连接数据库 2、拿到查询游标 3、创建sql 4、运行sql 5、关闭游标2、通用代码 import pymysqldef createData(dataDict,tableName):"""给数据表创建数据:param dataDict: 字典:param tableName: 表名:return: "…

intouch的报警怎么发到企业微信机器人

厂务报警通知系列博客目录 intouch的报警怎么发到微信上 intouch的报警怎么发到邮件上 intouch的报警怎么发到短信上 intouch的报警怎么发到企业微信机器人 intouch的报警怎么发到飞书机器人 intouch的报警怎么用语音通知到手机用户 创建企业微信群机器人 打开企业微信客…

【AI-6】算力和带宽

上述为大模型训练的显卡选项 tensor fp16 算力是什么&#xff1f; Tensor FP16(Float16)算力是指GPU在执行深度学习的张量计算时,使用float16(半精度浮点)数据类型所能达到的性能指标。 为什么要使用Tensor FP16? 提升计算效率: float16数据类型的存储和计算开销比float32…

网格布局之跨行越列

网格布局之跨行越列 欢迎关注&#xff1a;xssy5431 小拾岁月 参考链接&#xff1a;https://mp.weixin.qq.com/s/xStfSmewncTW49N0Y_Vhow 点击查看 使用场景 在常见的页面布局中&#xff0c;我们往往会遇到那种类似合并单元格的布局。比如&#xff1a;成绩排名、产品排名等等…

食品安全管理员题库

31.获准使用绿色食品标志的产品&#xff0c;&#xff08; &#xff09;加贴绿色食品标志防伪标签。 A.必须 B.自愿 答案:A 32.绿色食品生产企业重新通过产品认证&#xff0c;可继续使用绿色食品标志&#xff0c;标志上的编号&#xff08; &#xff09;。 A.不变 B.需要更…

第10关:视图1 、第11关:视图2 、第12关:用户。

目录 第10关&#xff1a;视图1 任务描述 知识补充 答案 第11关&#xff1a;视图2 任务描述 知识补充 答案 第12关&#xff1a;用户 任务描述 知识补充 答案 本篇博客声明&#xff1a;所有题的答案不在一起&#xff0c;可以去作者博客专栏寻找其它文章。 第10关&…

计算机网络(物理层)

物理层 物理层最核心的工作内容就是解决比特流在线路上传输的问题 基本概念 何为物理层&#xff1f;笼统的讲&#xff0c;就是传输比特流的。 可以着重看一下物理层主要任务的特性 传输媒体 传输媒体举例&#xff1a; 引导型传输媒体 引导型传输媒体指的是信号通过某种…

调试器烧录失败的几种常见解决办法

目录 1. 检查接线、Keil配置是否正确 2. 降低下载速度 3. SWD引脚被禁用或被复用为其他功能 4. 使用CubeMX生成的工程&#xff0c;无法调试&#xff1f; 5. 能识别到芯片但是下载时弹出报错对话框&#xff08;Command not supported&#xff09; 6. 内部flash锁死&#x…

深入解析Linux Bridge:原理、架构、操作与持久化配置

一、引言 在计算机网络中&#xff0c;桥接技术扮演着至关重要的角色&#xff0c;它能够实现不同网络设备之间的数据交换与共享。Linux Bridge作为Linux内核提供的一种网络功能&#xff0c;允许用户通过软件方式将多个网络接口桥接在一起&#xff0c;形成一个透明的二层网络。本…

python的os包总结

Python 的 os 模块提供了一系列与操作系统交互的功能&#xff0c;使你可以使用Python代码来执行许多与操作系统相关的任务&#xff0c;比如文件和目录操作、环境变量处理、进程管理等。以下是对 os 模块的一些详细介绍和常见用法。 导入 os 模块 import os文件和目录操作 获…

空间复杂度 线性表,顺序表尾插。

各位少年&#xff0c;大家好&#xff0c;我是那一脸阳光&#xff0c;本次分享的主题是时间复杂度和空间复杂度 还有顺序表文章讲解和分享&#xff0c;如有不对可以评论区指导。 时间复杂度例题 // 计算斐波那契递归Fib的时间复杂度&#xff1f; long long Fib(size_t N){if(N…

java:CompletableFuture的简单例子

java&#xff1a;CompletableFuture的简单例子 package com.chz.myTest;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.uti…

Spring Boot事件监听使用指南

Spring Boot事件监听使用指南 在Spring Boot中&#xff0c;事件监听是一种常见的设计模式&#xff0c;用于在事件发生时通知感兴趣的组件。通过事件监听机制&#xff0c;我们可以实现模块之间的松耦合&#xff0c;增强系统的可扩展性和可维护性。本文将详细介绍如何通过实现类…

注解详解系列 - @Lazy:懒加载管理

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨Lazy注解。Lazy是Spring框架中的一个重要注解&#xff0c;用于实现bean的懒加载。懒加载是一种优化技术&#xff0c;可以延迟bean的初始化&#xff0c;直到首次使用时才进行创建。 注解定义 Lazy注解用于指示Spring容器…

C++语法基础:函数指针

前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 引入 指针的一种,前一篇和指针相关的帖子C基础语法:指针“进阶“---结点,双重指针-CSDN博客 函数指针的思想 既然属于指针的一种,他背后的…

读AI新生:破解人机共存密码笔记05逻辑

1. 困难问题 1.1. 管理政府或教授分子生物学之类的问题要困难得多 1.2. 这些环境很复杂&#xff0c;大部分是不可观察的&#xff08;一个国家的状态&#xff0c;一个学生的思想状态&#xff09;&#xff0c;还有更多的对象和对象类型&#xff0c;对动作…

嵌入式通信协议----Wi-Fi协议详解(二)(基于STM32+有人物联网WIFI模块)

四、有人WIFI模块 1.模块介绍 Wi-Fi 模块用于实现串口到 Wi-Fi 数据包的双向透明转发&#xff0c;模块内部完成协议转换&#xff0c;通 过该模块&#xff0c;客户可以将物理设备连接到 Wi-Fi 网络上&#xff0c;从而实现物联网的控制与管理。 2.模块参数 Wi-Fi 模块的…