当前位置: 首页 > news >正文

取名网站开发中国企业网官方网站

取名网站开发,中国企业网官方网站,建网站可以铺货,有了php源码怎么做网站在使用opencv中的remap函数时&#xff0c;发现运行时间太长了&#xff0c;如果使用视频流进行重映射时根本不能实时&#xff0c;因此只能加速 1.使用opencv里的cv::cuda::remap函数 cv::cuda::remap函数头文件是#include <opencv2/cudawarping.hpp>&#xff0c;编译ope…

在使用opencv中的remap函数时,发现运行时间太长了,如果使用视频流进行重映射时根本不能实时,因此只能加速

1.使用opencv里的cv::cuda::remap函数

cv::cuda::remap函数头文件是#include <opencv2/cudawarping.hpp>,编译opencv时需要用cuda进行编译

    //1.重映射矩阵转成cuda处理的数据格式//map_x,map_y是重映射表,数据类型是CV_32FC1cv::cuda::GpuMat m_mapx = ::cv::cuda::GpuMat(map_x);cv::cuda::GpuMat m_mapy = ::cv::cuda::GpuMat(map_y);//2.原图像转成cuda处理的数据格式cv::cuda::GpuMat src(img);//3.计算结果cv::cuda::GpuMat gpuMat2;cv::cuda::remap(src, gpuMat2, m_mapx, m_mapy, cv::INTER_LINEAR);//4.结果转成Matcv::Mat dstimage;		gpuMat2.download(dstimage);

示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudawarping.hpp>using namespace cv;int main(int argc, char** argv) 
{Mat img = imread("image.jpg", IMREAD_COLOR);if (img.empty()){std::cout << "Could not open the input image" << std::endl;exit(1);}int in_width = img.cols;int in_height = img.rows;Mat map_x(in_height, in_width, CV_32FC1);Mat map_y(in_height, in_width, CV_32FC1);// 创建重映射映射表for (int y = 0; y < in_height; y++) {for (int x = 0; x < in_width; x++) {map_x.at<float>(y, x) = (x + 20) / (float)in_width * in_width;map_y.at<float>(y, x) = y / (float)in_height * in_height;}}cv::cuda::GpuMat m_mapx = ::cv::cuda::GpuMat(map_x);cv::cuda::GpuMat m_mapy = ::cv::cuda::GpuMat(map_y);cv::cuda::GpuMat gpuMat1(img);double time0 = static_cast<double>(cv::getTickCount());//记录起始时间cv::cuda::GpuMat gpuMat2;cv::cuda::remap(gpuMat1, gpuMat2, m_mapx, m_mapy, cv::INTER_LINEAR);cv::Mat GPUimage;gpuMat2.download(GPUimage);	time0 = ((double)cv::getTickCount() - time0) / cv::getTickFrequency();std::cout << "GPU运行remap函数的时间为:" << time0 * 1000 << "ms" << std::endl;double time1 = static_cast<double>(cv::getTickCount());//记录起始时间cv::Mat CPUimage;cv::remap(img, CPUimage, map_x, map_y, cv::INTER_LINEAR);time1 = ((double)cv::getTickCount() - time1) / cv::getTickFrequency();std::cout << "CPU运行remap函数的时间为:" << time1 * 1000 << "ms" << std::endl;return 0;
}

经过实际运行,在我电脑上速度快了15倍左右

2.在cuda上重写remap函数

这是在csdn上看到的一篇文章上写的代码,在我的实际应用中变换的结果是错误的,由于我实际的应用时,我的图像输入尺寸和输出尺寸是不相同的,因此运行错误,但是在输入输出是相同尺寸时是正确的,因为使用了cv::cuda::remap,我也没修改这个程序。
建立.cu文件,可以生成静态库使用,也可以不生成使用

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cuda_runtime_api.h>
#include <stdio.h>
#include <math.h>__global__ void remap_kernel(const unsigned char* src, int src_width, int src_height,unsigned char* dst, int dst_width, int dst_height,const float* map_x, const float* map_y) 
{int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.y + blockIdx.y * blockDim.y;if (x < dst_width && y < dst_height) {int index = (y * dst_width + x) * 3;float src_x = map_x[index / 3];float src_y = map_y[index / 3];if (src_x >= 0 && src_x < src_width - 1 && src_y >= 0 && src_y < src_height - 1) {int x0 = floorf(src_x);int y0 = floorf(src_y);int x1 = x0 + 1;int y1 = y0 + 1;float tx = src_x - x0;float ty = src_y - y0;int src_index00 = (y0 * src_width + x0) * 3;int src_index10 = (y0 * src_width + x1) * 3;int src_index01 = (y1 * src_width + x0) * 3;int src_index11 = (y1 * src_width + x1) * 3;for (int i = 0; i < 3; i++) {float value00 = src[src_index00 + i];float value10 = src[src_index10 + i];float value01 = src[src_index01 + i];float value11 = src[src_index11 + i];float value0 = value00 * (1.0f - tx) + value10 * tx;float value1 = value01 * (1.0f - tx) + value11 * tx;float value = value0 * (1.0f - ty) + value1 * ty;dst[index + i] = static_cast<unsigned char>(value);}}}
}extern "C"  void remap_gpu(const unsigned char* in, int in_width, int in_height,unsigned char* out, int out_width, int out_height,const float* map_x, const float* map_y) {unsigned char* d_in, * d_out;float* d_map_x, * d_map_y;cudaMalloc((void**)&d_in, in_width * in_height * 3);cudaMalloc((void**)&d_out, out_width * out_height * 3);cudaMalloc((void**)&d_map_x, out_width * out_height * sizeof(float));cudaMalloc((void**)&d_map_y, out_width * out_height * sizeof(float));cudaMemcpy(d_in, in, in_width * in_height * 3, cudaMemcpyHostToDevice);cudaMemcpy(d_map_x, map_x, out_width * out_height * sizeof(float), cudaMemcpyHostToDevice);cudaMemcpy(d_map_y, map_y, out_width * out_height * sizeof(float), cudaMemcpyHostToDevice);dim3 block(32, 32, 1);dim3 grid((out_width + block.x - 1) / block.x, (out_height + block.y - 1) / block.y, 1);remap_kernel << <grid, block >> > (d_in, in_width, in_height, d_out, out_width, out_height, d_map_x, d_map_y);cudaMemcpy(out, d_out, out_width * out_height * 3, cudaMemcpyDeviceToHost);cudaFree(d_in);cudaFree(d_out);cudaFree(d_map_x);cudaFree(d_map_y);
}

重新新建一个.cpp文件

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;extern "C"  void remap_gpu(const unsigned char* in, int in_width, int in_height,unsigned char* out, int out_width, int out_height,const float* map_x, const float* map_y);int main(int argc, char** argv) 
{cv::Mat img = imread("image.jpg", IMREAD_COLOR);if (img.empty()) {std::cout << "Could not open the input image" << std::endl;exit(1);}int in_width = img.cols;int in_height = img.rows;cv::Mat map_x(in_height, in_width, CV_32FC1);cv::Mat map_y(in_height, in_width, CV_32FC1);// 创建重映射映射表for (int y = 0; y < in_height; y++) {for (int x = 0; x < in_width; x++) {map_x.at<float>(y, x) = (x + 20) / (float)in_width * in_width;map_y.at<float>(y, x) = y / (float)in_height * in_height;}}double time0 = static_cast<double>(cv::getTickCount());//记录起始时间cv::Mat CPUimage;remap(img, CPUimage, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));time0 = ((double)cv::getTickCount() - time0) / cv::getTickFrequency();std::cout << "CPU 运行remap函数时间为:" << time0 * 1000 << "ms" << std::endl;int out_width = in_width;int out_height = in_height;	unsigned char* out = (unsigned char*)malloc(out_width * out_height * 3);double time1 = static_cast<double>(cv::getTickCount());//记录起始时间unsigned char* in = (unsigned char*)img.data;remap_gpu(in, in_width, in_height, out, out_width, out_height, (float*)map_x.data, (float*)map_y.data);cv::Mat GPUimage(out_height, out_width, CV_8UC3, out);time1 = ((double)cv::getTickCount() - time1) / cv::getTickFrequency();std::cout << "GPU 运行remap函数时间为:" << time1 * 1000 << "ms" << std::endl;free(out);return 0;
}

只运行一帧时cpu上运行的remap较快,运行多帧时,GPU上运行的remap函数要比CPU上运行快5倍左右

总结

如果自己编译的opencv带cuda,最好还是使用cv::cuda::remap函数,耗时较少

http://www.tj-hxxt.cn/news/126268.html

相关文章:

  • 卸载 wordpressseo自然搜索优化排名
  • 济宁祥云网站建设换友情链接的网站
  • 手机新闻网站源码免费网站自助建站系统
  • 西安巨久科技网站建设seo是什么专业
  • 网站搜索优化怎么做关键词网站查询
  • 餐饮手机微网站怎么做网页制作代码html制作一个网页
  • 插画师个人网站是怎么做的查询网站备案信息
  • 兰山网站建设网站不收录怎么办
  • 重庆建筑模板厂家电话seo网络营销的技术
  • 制作网站加背景怎么做流程百度搜索大数据
  • 用php做的企业网站作业硬件优化大师下载
  • 如何免费做网站网页网站运维
  • 网站上的图用美图秀秀做可以吗裂变营销五种模式十六种方法
  • 青浦郑州阳网站建设百度游戏排行榜风云榜
  • wordpress怎么配置seo小白入门教学
  • 网站建设谈业务要知道什么百度app怎么找人工客服
  • 手机端建站站长权重
  • 网站ip访问做图表腾讯域名注册官网
  • 怎样把自己做的网站发布网站如何推广
  • 学做网站要什么基础网站如何优化排名
  • 关于单位网站建设的营销方案怎么写?
  • 推进政府网站建设嘉兴百度快照优化排名
  • 网站建设jw100长春免费网上推广
  • 学校校园网站建设方案软文范例大全1000字
  • 荣县住房和城乡建设厅网站廊坊seo整站优化软件
  • 做网站运营工作有前景吗螺蛳粉的软文推广
  • 网络推广公司效果不好起诉关键词优化一年的收费标准
  • 石家庄网站建设培训班足球最新世界排名表
  • 花钱做网站注意些什么网站seo链接购买
  • 电脑网页浏览器深圳网站seo推广