4. 工具应用参考¶
4.1. 工具的参数如何导入导出?¶
4.1.1. 使用工具导入导出参数¶
CviPQ Tool支持在PC端的json格式配置文件导入和导出,并且支持将工具的参数固化到板端。
如果用户想要导出或导入CviPQ Tool的参数文件,可参考章节 2.4.3.1. 和 2.4.3.2. 的说明进行操作。
如果用户想要将参数导入到板端或者从板端导出到PC端进行备份,请使用二进制实用工具(Bin Utility工具)进行操作。具体的操作说明如下:
导入导出板端参数的BIN文件
在已连接到板端的情况下,点击菜单栏中的Bin Utility,即可打开二进制实用工具窗口,如 图 所示:
在Bin Import Export群组里有两个按钮,分别点击按钮可完成如下操作:
导入参数bin文件到板端:点击“Import Bin File”在弹出的打开文件对话框中选择需要导入的正确参数bin文件,当工具完成发送文件到板端时,参数会立即生效。
导出板端参数bin文件:点击bin type下拉框选择导出类型,然后点击“Export Bin File”在弹出的保存文件对话框中选择一个保存路径,工具会将板端上选中类型的参数保存在指定的路径。
将参数配置固化到Flash
在Bin Fix群组内填写作者、描述信息和时间信息后,可点击“Fix Bin to Flash”向板端发送指令,将当前板端的参数信息写入到Flash中。
4.1.2. 使用库导入导出图像质量参数¶
板端工具提供导入导出参数库文件,以下两种方式可根据自己的需要进行选择。注意:以下接口必须在调用CVI_ISP_Init接口之后才能调用。
获取和保存所有模块bin数据(ISP x、VPSS、VO等):
CVI_BIN_GetBinTotalLen: 获取bin数据的总长度;
CVI_BIN_ExportBinData: 导出所有模块bin数据;
CVI_BIN_ImportBinData: 导入bin数据,会根据bin中的模块数据和当前的所有模块进行匹配,将所有符合条件的数据导入;
获取和保存单个模块bin数据(ISP x、VPSS、VO等):
CVI_BIN_GetSingleISPBinLen: 获取某个模块的bin数据的长度;
CVI_BIN_ExportSingleISPBinData: 导出单个模块bin数据;
CVI_BIN_SaveParamToBin: 导出所有模块bin数据;
CVI_BIN_LoadParamFromBin: 导入单个模块bin数据;
CVI_BIN_LoadParamFromBinEx: 导入单个模块bin(含输入buf长度)数据;
可参考推荐使用流程,如下图所示。
其他相关接口API:
CVI_BIN_SetBinName: 设置PQBin存放的路径和文件名;
CVI_BIN_GetBinName: 获取PQBin存放的路径和文件名;
CVI_BIN_GetBinExtraAttr: 获取bin头数据信息;
CVI_BIN_EnSingleMode: 设置PQBin为单模块模式;
CVI_BIN_DisSingleMode: 取消PQBin的单模块模式;
CVI_ISP_BIN_SetBypassParams: 设置bin加载时参数的失效与否,默认都生效;
CVI_ISP_BIN_GetBypassParams: 获取bin加载时参数的生效信息;
4.1.3. API参考¶
4.1.3.1. CVI_BIN_GetBinTotalLen¶
【描述】
获取bin数据的总长度。
【语法】
CVI_U32 CVI_BIN_GetBinTotalLen(void);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
无 |
无 |
无 |
【返回值】
返回值 |
描述 |
---|---|
CVI_U32 |
bin文件的总长度 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
此函数必须在调用 CVI_BIN_ExportBinData 接口前调用。
【举例】
CVI_U32 u32BinLen = 0;
u32BinLen = CVI_BIN_GetBinTotalLen();
【相关主题】
4.1.3.2. CVI_BIN_ExportBinData¶
【描述】
导出所有模块bin数据。
【语法】
CVI_S32 CVI_BIN_ExportBinData(CVI_U8*pu8Buffer, CVI_U32 u32DataLength);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
pu8Buffer |
保存pqbin资料的buffer |
输入 |
u32DataLength |
pqbin资料的总长度 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,其值请参见 错误码1。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
调用此函数必须先调用 CVI_BIN_GetBinTotalLen 函数,获取数据的大小,否则可能出现内存问题。
【举例】
CVI_S32 ret = CVI_SUCCESS;
CVI_BIN_HEADER header;
CVI_U32 u32BinLen = 0, u32TempLen = 0;
CVI_U8 *pBuffer;
memset(&header, 0, sizeof(CVI_BIN_HEADER));
u32BinLen = CVI_BIN_GetBinTotalLen();
pBuffer = (CVI_U8 *)malloc(u32BinLen);
if (pBuffer == NULL) {
ISP_DAEMON_DEBUG(LOG_ALERT, "malloc err!\\n");
return CVI_FAILURE;
}
header.extraInfo = *binExtra;
memcpy(pBuffer, &header, sizeof(CVI_BIN_HEADER));
ret = CVI_BIN_ExportBinData(pBuffer, u32BinLen);
if (ret != CVI_SUCCESS) {
ISP_DAEMON_DEBUG_EX(LOG_ALERT, "CVI_BIN_ExportBinData err(%#x)!\\n", ret);
} else {
u32TempLen = fwrite(pBuffer, 1, u32BinLen, fp);
if (u32TempLen != u32BinLen) {
ISP_DAEMON_DEBUG(LOG_ALERT, "writeIspRegToBin fail\\n");
ret = CVI_FAILURE;
}
}
if (pBuffer != NULL) {
free(pBuffer);
}
ISP_DAEMON_UNUSED(numDevice);
return ret;
【相关主题】
无
4.1.3.3. CVI_BIN_ImportBinData¶
【描述】
导入所有模块bin数据,会根据bin中的模块数据和当前所有的模块进行匹配,将所有符合条件的数据导入。
【语法】
CVI_S32 CVI_BIN_ImportBinData(CVI_U8*pu8Buffer, CVI_U32 u32DataLength);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
pu8Buffer |
Bin的内存空间 |
输入 |
u32DataLength |
Bin大小 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,其值请参见 错误码2 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so libcvi_bin_isp.so
【注意】
无
【举例】
CVI_S32 ret = CVI_SUCCESS;
FILE *fp = NULL;
CVI_U8 *buf = NULL;
CVI_CHAR binName[BIN_FILE_LENGTH] = { 0 };
CVI_U32 u32TempLen = 0, u32FileSize = 0;
ret = CVI_BIN_GetBinName(binName);
if (ret != CVI_SUCCESS) {
CVI_TRACE_SYS(CVI_DBG_WARN, "GetBinName(%s) fail\\n", binName);
}
fp = fopen((const CVI_CHAR *)binName, "rb");
if (fp == NULL) {
CVI_TRACE_SYS(CVI_DBG_WARN, "Can't find bin(%s)\\n", binName);
ret = CVI_FAILURE;
goto ERROR_HANDLER;
} else {
CVI_TRACE_SYS(CVI_DBG_WARN, "Bin exist (%s)\\n", binName);
}
getFileSize(fp, &u32FileSize);
buf = (CVI_U8 *)malloc(u32FileSize);
if (buf == NULL) {
ret = CVI_FAILURE;
CVI_TRACE_SYS(CVI_DBG_WARN, "Allocate memory fail\\n");
goto ERROR_HANDLER;
}
u32TempLen = fread(buf, u32FileSize, 1, fp);
if (u32TempLen <= 0) {
CVI_TRACE_SYS(CVI_DBG_WARN, "read data to buff fail!\\n");
ret = CVI_FAILURE;
goto ERROR_HANDLER;
}
ret = CVI_BIN_ImportBinData(buf, (CVI_U32)u32FileSize);
if (ret != CVI_SUCCESS) {
CVI_TRACE_SYS(CVI_DBG_WARN, "CVI_BIN_ImportBinData error! value:(0x%x)\\n", ret);
goto ERROR_HANDLER;
}
ERROR_HANDLER:
if (fp != NULL) {
fclose(fp);
}
if (buf != NULL) {
free(buf);
}
return ret;
【相关主题】
无
4.1.3.4. CVI_BIN_GetSingleISPBinLen¶
【描述】
获取某个模块的bin数据的长度。
【语法】
CVI_S32 CVI_BIN_GetSingleISPBinLen(enum CVI_BIN_SECTION_ID id);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块ID |
输入 |
【返回值】
返回值 |
描述 |
---|---|
CVI_U32 |
某个模块的bin文件长度 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
此函数必须在调用 CVI_BIN_ExportSingleISPBinData 接口前调用。
【举例】
CVI_U32 u32BinLen = 0;
enum CVI_BIN_SECTION_ID id = CVI_BIN_ID_ISP0;
u32BinLen = CVI_BIN_GetBinTotalLen(id);
【相关主题】
4.1.3.5. CVI_BIN_ExportSingleISPBinData¶
【描述】
导出单个模块的bin数据。
【语法】
CVI_BIN_ExportSingleISPBinData(enum CVI_BIN_SECTION_ID id, CVI_U8*pu8Buffer, CVI_U32 u32DataLength);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块ID |
输入 |
pu8Buffer |
保存pqbin资料的buffer |
输入 |
u32DataLength |
pqbin资料的总长度 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,其值请参见 错误码1。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
调用此函数必须先调用 CVI_BIN_GetSingleISPBinLen 函数,获取数据的大小,否则可能出现内存问题。
【举例】
CVI_S32 ret = CVI_SUCCESS;
CVI_BIN_HEADER header;
CVI_U32 u32BinLen = 0, u32TempLen = 0;
CVI_U8 *pBuffer;
enum CVI_BIN_SECTION_ID id = CVI_BIN_ID_ISP0;
memset(&header, 0, sizeof(CVI_BIN_HEADER));
u32BinLen = CVI_BIN_GetSingleISPBinLen(id);
pBuffer = (CVI_U8 *)malloc(u32BinLen);
if (pBuffer == NULL) {
ISP_DAEMON_DEBUG(LOG_ALERT, "malloc err!\\n");
return CVI_FAILURE;
}
header.extraInfo = *binExtra;
memcpy(pBuffer, &header, sizeof(CVI_BIN_HEADER));
ret = CVI_BIN_ExportSingleISPBinData(id, pBuffer, u32BinLen);
if (ret != CVI_SUCCESS) {
ISP_DAEMON_DEBUG_EX(LOG_ALERT, "CVI_BIN_ExportBinData err(%#x)!\\n", ret);
} else {
u32TempLen = fwrite(pBuffer, 1, u32BinLen, fp);
if (u32TempLen != u32BinLen) {
ISP_DAEMON_DEBUG(LOG_ALERT, "writeIspRegToBin fail\\n");
ret = CVI_FAILURE;
}
}
if (pBuffer != NULL) {
free(pBuffer);
}
ISP_DAEMON_UNUSED(numDevice);
return ret;
【相关主题】
无
4.1.3.6. CVI_BIN_SaveParamToBin¶
【描述】
导出单个模块的bin数据
【语法】
CVI_S32 CVI_BIN_SaveParamToBin(FILE*fp, CVI_BIN_EXTRA_S*extraInfo);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
fp |
PQBin文件指针 |
输入 |
extraInfo |
PQBin 信息和描述 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,其值请参见 错误码1 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
CVI_BIN_EXTRA_S BinExtra = {
"User",
"test-default",
"2021-04-19",
};
FILE *fd = fopen(TEST_BIN, "wb");
if (fd == NULL) {
ISP_DEBUG(LOG_ERR, "Open file failed\\n");
}
CVI_BIN_SaveParamToBin(fd, &BinExtra);
fclose(fd);
【相关主题】
无
4.1.3.7. CVI_BIN_LoadParamFromBin¶
【描述】
导入单个模块bin数据。
【语法】
CVI_S32 CVI_BIN_LoadParamFromBin(enum CVI_BIN_SECTION_ID id, CVI_U8*buf);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块ID |
输入 |
buf |
PQBin的数据内容 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,请参见 错误码2 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
须先将PQBin从数据读到缓存内存空间,再呼叫此函数式。此 API 的功能之后会由 CVI_BIN_LoadParamFromBinEx 所取代 , 建议改用。
【举例】
CVI_S32 result = CVI_FAILURE;
CVI_U32 size = 0;
FILE *fp;
ISP_DEBUG(LOG_DEBUG, "try load default value from bin %s\\n", TEST_BIN);
fp = fopen(TEST_BIN, "rb");
if (fp == NULL) {
ISP_DEBUG(LOG_WARNING, "Cant find bin(%s)\\n", TEST_BIN);
} else {
ISP_DEBUG(LOG_INFO, "Bin exist (%s)\\n", TEST_BIN);
}
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
rewind(fp);
if (size > 0) {
// allocate buffer
CVI_U8 *binBuffer = malloc(size);
fread(binBuffer, size, 1, fp);
for (CVI_U32 idx = CVI_BIN_ID_MIN ; idx < CVI_BIN_ID_MAX ; idx++) {
result = CVI_BIN_LoadParamFromBin((enum CVI_BIN_SECTION_ID)idx, binBuffer);
}
// free buffer
free(binBuffer);
if (result == CVI_SUCCESS) {
ISP_DEBUG(LOG_DEBUG, "load default value from bin %s\\n", TEST_BIN);
}
【相关主题】
4.1.3.8. CVI_BIN_LoadParamFromBinEx¶
【描述】
【语法】
CVI_S32 CVI_BIN_LoadParamFromBin(enum CVI_BIN_SECTION_ID id, CVI_U8*buf, CVI_U32 u32DataLength);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块ID |
输入 |
buf |
PQBin的数据内容 |
输入 |
u32DataLength |
buf的大小 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,请参见 错误码2 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
【举例】
请参考 CVI_BIN_LoadParamFromBin ,注意的是:需将buf的大小传入。
4.1.3.9. CVI_BIN_SetBinName¶
【描述】
设置PQBin存放的路径和文件名。
【语法】
CVI_S32 CVI_BIN_SetBinName(WDR_MODE_E wdrMode, const CVI_CHAR *binName);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
wdrMode |
Sensor wdr mode |
输入 |
binName |
设定和wdr mode对应pqbin的路径和文件名 例如”/mnt/data/cvi_sdr_bin” |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,请参见错误码。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
无
【相关主题】
4.1.3.10. CVI_BIN_GetBinName¶
【描述】
获取PQBin存放的路径和文件名。
【语法】
CVI_S32 CVI_BIN_GetBinName(CVI_CHAR*binName);
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
binName |
pqbin路径和文件名 |
输出 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
非 0 |
失败,请参见错误码。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
无
【相关主题】
4.1.3.11. CVI_BIN_GetBinExtraAttr¶
【描述】
获取bin头数据信息。
【语法】
CVI_S32 CVI_BIN_GetBinExtraAttr(FILE*fp, CVI_BIN_EXTRA_S*extraInfo)
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
fp |
PQBin文件指针 |
输入 |
extraInfo |
bin头信息的内存空间 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
CVI_BIN_EXTRA_S BinExtraAttr = {};
FILE *fd = fopen("/mnt/data/bin/cvi_sdr_bin", "rb");
CVI_BIN_GetBinExtraAttr(fd, &BinExtraAttr);
【相关主题】
无
4.1.3.12. CVI_BIN_EnSingleMode¶
【描述】
设置PQBin为单模块模式。
【语法】
CVI_S32 CVI_BIN_EnSingleMode(void)
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
无 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
无
【相关主题】
无
4.1.3.13. CVI_BIN_DisSingleMode¶
【描述】
取消PQBin的单模块模式。
【语法】
CVI_S32 CVI_BIN_DisSingleMode(void)
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
无 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功。 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
无
【相关主题】
无
4.1.3.14. CVI_ISP_BIN_SetBypassParams¶
【描述】
设置bin加载时参数的失效与否,默认都生效。
【语法】
CVI_S32 CVI_ISP_BIN_SetBypassParams(enum CVI_BIN_SECTION_ID id, ISP_BIN_BYPASS_U * ispBinBypass)
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块id |
输入 |
ispBinBypass |
bin参数生效信息 |
输入 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功 |
-1 |
失败 |
0xCB000013 |
id错误 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
CVI_S32 ret = CVI_SUCCESS;
ISP_BIN_BYPASS_U ispBinBypass = {0};
ispBinBypass.bitBypassFrameRate = CVI_TRUE;
ret = CVI_ISP_BIN_SetBypassParams(CVI_BIN_ID_ISP0, &ispBinBypass);
【相关主题】
无
4.1.3.15. CVI_ISP_BIN_GetBypassParams¶
【描述】
设置bin加载时参数的失效与否,默认都生效。
【语法】
CVI_S32 CVI_ISP_BIN_GetBypassParams(enum CVI_BIN_SECTION_ID id, ISP_BIN_BYPASS_U * ispBinBypass)
【参数】
参数名称 |
描述 |
输入/输出 |
---|---|---|
id |
模块id |
输入 |
ispBinBypass |
bin参数生效信息 |
输出 |
【返回值】
返回值 |
描述 |
---|---|
0 |
成功 |
-1 |
失败 |
0xCB000013 |
id错误 |
【需求】
头文件:cvi_bin.h
库文件:libcvi_bin.so,libcvi_bin_isp.so
【注意】
无
【举例】
CVI_S32 ret = CVI_SUCCESS;
ISP_BIN_BYPASS_U ispBinBypass = {0};
ret = CVI_ISP_BIN_GetBypassParams(CVI_BIN_ID_ISP0, &ispBinBypass);
【相关主题】
无
4.1.3.16. 错误码1¶
接口返回值 |
含义 |
---|---|
0xCB000001 |
入参指针为空 |
0xCB000003 |
未分配到内存空间 |
0xCB00000B |
json压缩失败 |
0xCB00000D |
输入的buffer空间不足 |
0xCB00000F |
更新参数到PQbin文件失败 |
0xCB000012 |
创建json句柄失败 |
0xCB000013 |
输入的模块id无效 |
0xCB000014 |
从文件中读参数失败 |
4.1.3.17. 错误码2¶
接口返回值 |
含义 |
---|---|
0xCB000001 |
入参指针为空 |
0xCB000003 |
未分配到内存空间 |
0xCB000006 |
输入buf的大小为0 |
0xCB000008 |
PQbin中的数据有异常 |
0xCB00000C |
json解压缩失败 |
0xCB00000F |
更新参数到PQbin文件失败 |
0xCB000010 |
无法找到bin文件 |
0xCB000011 |
当前PQbin文件中json参数是无效的 |
0xCB000012 |
创建json句柄失败 |
0xCB000013 |
输入的模块id无效 |
0xCB000014 |
从文件中读参数失败 |
0xCB000015 |
当前所用的PQbin文件是无效的 |
0xCB000016 |
Sensor数目超出PQbin文件指定的数目 |