- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
首先,你需要知道模块插件是gstnvinfer ,所以你需要在这个模块增加打印代码
模块路径:/opt/nvidia/deepstream/deepstream-6.0/sources/gst-plugins/gst-nvinfer/gstnvinfer.cpp
此方法是DGPU方式,如果需要jetson方式,按照上篇后处理图片保存修改即可
首先是保存图片的方法:
我的printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);
打印的结果是: 27 所以我的是RGB模式。
//zwh start
static void save_transformed_plate_images(NvBufSurface * surface) {
for (uint frameIndex = 0; frameIndex < surface->numFilled;
frameIndex++) {
void *src_data = NULL;
src_data = (char *)malloc(surface->surfaceList[frameIndex].dataSize);
if (src_data == NULL) {
g_print("Error: failed to malloc src_data \n");
}
cudaMemcpy((void *)src_data,
(void *)surface->surfaceList[frameIndex].dataPtr,
surface->surfaceList[frameIndex].dataSize,
cudaMemcpyDeviceToHost);
gint frame_width = (gint)surface->surfaceList[frameIndex].width;
gint frame_height = (gint)surface->surfaceList[frameIndex].height;
size_t frame_step = surface->surfaceList[frameIndex].pitch;
printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);
cv::Mat frame = cv::Mat(frame_height, frame_width, CV_8UC3, src_data, frame_step);
cv::Mat out_mat = cv::Mat(cv::Size(frame_width, frame_height), CV_8UC3);
cv::cvtColor(frame, out_mat, CV_RGB2BGR);
char yuv_name[100] = "";
sprintf(yuv_name, "yuv_%ld.png", appCtx->kafka_last_send_time);
cv::imwrite(yuv_name, out_mat);
}
return;
}
调用位置在convert_batch_and_push_to_input_thread方法中完成Transform后:
save_transformed_plate_images(mem->surf);
printf(
"\n---------------->saved transformed plate images to disk prior to sgie "
"detection");
即可打印出来图片。
另外还有其他小的注意点:
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
头文件及makefile配置,就不过多赘述了。
CFLAGS+=-I/usr/local/include/opencv4/
整个代码段展示:
//zwh start
static void save_transformed_plate_images(NvBufSurface * surface) {
for (uint frameIndex = 0; frameIndex < surface->numFilled;
frameIndex++) {
void *src_data = NULL;
src_data = (char *)malloc(surface->surfaceList[frameIndex].dataSize);
if (src_data == NULL) {
g_print("Error: failed to malloc src_data \n");
}
cudaMemcpy((void *)src_data,
(void *)surface->surfaceList[frameIndex].dataPtr,
surface->surfaceList[frameIndex].dataSize,
cudaMemcpyDeviceToHost);
gint frame_width = (gint)surface->surfaceList[frameIndex].width;
gint frame_height = (gint)surface->surfaceList[frameIndex].height;
size_t frame_step = surface->surfaceList[frameIndex].pitch;
printf("all_bbox_generated called! colorformat =%d\n", surface->surfaceList[frameIndex].colorFormat);
cv::Mat frame = cv::Mat(frame_height, frame_width, CV_8UC3, src_data, frame_step);
cv::Mat out_mat = cv::Mat(cv::Size(frame_width, frame_height), CV_8UC3);
cv::cvtColor(frame, out_mat, CV_RGB2BGR);
char yuv_name[100] = "";
sprintf(yuv_name, "yuv_%ld.png", appCtx->kafka_last_send_time);
cv::imwrite(yuv_name, out_mat);
}
return;
}
static gboolean
convert_batch_and_push_to_input_thread (GstNvInfer *nvinfer,
GstNvInferBatch *batch, GstNvInferMemory *mem)
{
NvBufSurfTransform_Error err = NvBufSurfTransformError_Success;
std::string nvtx_str;
/* Set the transform session parameters for the conversions executed in this
* thread. */
err = NvBufSurfTransformSetSessionParams (&nvinfer->transform_config_params);
if (err != NvBufSurfTransformError_Success) {
GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
("NvBufSurfTransformSetSessionParams failed with error %d", err), (NULL));
return FALSE;
}
nvtxEventAttributes_t eventAttrib = {0};
eventAttrib.version = NVTX_VERSION;
eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
eventAttrib.colorType = NVTX_COLOR_ARGB;
eventAttrib.color = 0xFFFF0000;
eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
nvtx_str = "convert_buf batch_num=" + std::to_string(nvinfer->current_batch_num);
eventAttrib.message.ascii = nvtx_str.c_str();
nvtxDomainRangePushEx(nvinfer->nvtx_domain, &eventAttrib);
if (batch->frames.size() > 0) {
/* Batched tranformation. */
err = NvBufSurfTransform (&nvinfer->tmp_surf, mem->surf,
&nvinfer->transform_params);
}
nvtxDomainRangePop (nvinfer->nvtx_domain);
if (err != NvBufSurfTransformError_Success) {
GST_ELEMENT_ERROR (nvinfer, STREAM, FAILED,
("NvBufSurfTransform failed with error %d while converting buffer", err),
(NULL));
return FALSE;
}
save_transformed_plate_images(mem->surf);
printf(
"\n---------------->saved transformed plate images to disk prior to sgie "
"detection");
LockGMutex locker (nvinfer->process_lock);
/* Push the batch info structure in the processing queue and notify the output
* thread that a new batch has been queued. */
g_queue_push_tail (nvinfer->input_queue, batch);
g_cond_broadcast (&nvinfer->process_cond);
return TRUE;
}
————————————————
版权声明:本文为CSDN博主「zhang-wen-han」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35377454/article/details/123797606
前一段时间写过一篇文章《 实战,一个高扩展、可视化低代码前端,详实、完整 》,得到了很多朋友的关注。 其中的逻辑编排部分过于简略,不少朋友希望能写一些关于逻辑编排的内容,本文就详细讲述一下逻辑
我正在尝试以下 Java 片段: int[] testArray={10,20,30,40}; int i= 0; testArray[i++]= testArray[i++]+1; System.o
我想知道我是否可以通过某种方式在 C++ 中进行前/后函数调用。我有一个包含很多函数的包装器类,在每次调用包装器函数后,我应该调用另一个始终相同的函数。 所以我不想像这样对每个函数调用 postFun
我有一个像这样的头文件: #pragma once #include "gamestate.h" #include "ExitListener.h" class InitialGameState :
学习左值和右值。定义是任何可以是“地址”的东西都是左值,否则就是右值。 我检查了运算符的优先级,前缀和后缀增量都比“地址”运算符具有更高的优先级。 对于下面的两个例子,谁能解释一下为什么第一个“&++
在我的学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们就地创建容器元素。从文档来看,容器似乎需要实现 push_back 函数才能与 back_iterator 一起使用。但是有没有一种方法可
我有两个关于 Java 中运算符优先级的类似问题。 第一个: int X = 10; System.out.println(X++ * ++X * X++); //it prints 1440 根据
请放轻松,不要对我开枪,因为我还是新手。 当我运行这段代码时,我完全糊涂了,终生无法弄清楚为什么: int y = 9; cout << "++y = " << ++y << "\n--y = " <
两种表达方式有区别吗: (*x)++ 和 ++(*x) 我可以看到这两个语句都替换了 *x 中 (*x+1) 的内容。但是它们之间有什么区别吗? 最佳答案 (*x)++ 计算为*x的值;作为副作用,*
我有一个如下所示的数据集: Date CONSUMER DISCR CONSUMER STAPLES ENERGY FINANCIALS HEALTH CARE
我希望检查名称字段中输入的前两个字符是否为字母 - 除此之外没有什么区别(空格、'、- 等都是公平的游戏)。这是我到目前为止所拥有的,但它不起作用。想法?谢谢! if (document.form01
我制作了一个简单的脚本,为像素和所有附近的像素着色为相同的颜色 Click foto
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我正在做一些练习,但我对这个感到困惑: public static int f (int x, int y) { int b=y--; while (b>0) { if (x%2!=0
我需要一个 4 个字符的正则表达式。前 3 个字符必须是数字,最后 1 个字符必须是字母或数字。 我形成了这个,但它不起作用 ^([0-9]{3}+(([a-zA-Z]*)|([0-9]*)))?$
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我有下面的程序,我试图找到前 1000 个素数的总和。在代码中,解决方案1和2有什么区别?为什么我不应该将 count 变量放在 if 条件之外?如果我把变量放在 if 之外,我显然没有得到我需要的答
这个问题在这里已经有了答案: Replace First N Occurrences in the String (7 个答案) 关闭 4 年前。 我有一个如下的字符串 const str = '_
我正在尝试测量以纳秒为单位的平均访问延迟,但在第一次迭代后我收到“段错误(核心转储)”。我错过了什么吗?我是否滥用了指针。这是导致错误的函数: #include #include #include
我有一个 SQL 问题 (MySQL)。我如何从下表创建一个新表(表名称:“well_master_prod_inj”)。 我需要按井名和日期聚合数据。我希望每个井名只有一行数据以及显示以下数据的列:
我是一名优秀的程序员,十分优秀!