OpenCV2.4.4+CUDA+VS2010实现图像的反转
来源:互联网 发布:sonos软件下载 编辑:程序博客网 时间:2024/05/17 11:05
实现图像的反转并不难,小编在opencv篇中已经把代码贴出。本文却又旧事重提,主要为了用CUDA实现并行处理反转过程,代码难度并不大,但是却是对opencv+CUDA结合起来的一个应用,给以后一些运算量大的图像算法用CUDA并行运算实现提供一个现实参考,好了,废话不多说,先贴上代码:
/***************************************************************************************************** * File name: cudaCppMain.cpp * Author: source code by RamiYim * Version: cs-hhu-cn0.0 * Date: 2014.08.12 * Description: 测试cuda与opencv相结合 * Others: * Function List: main functions and its function * History:<rami>,<20140819>,<添加相关函数>,<desc> <rami>,<20140812>,<创建文件>,<desc>******************************************************************************************************/#include "reverseImage.h"int main(){ reverseImage(cvLoadImage("D:/lena.jpg")); return 0;}
/***************************************************************************************************** * File name: reverseImage.h * Author: source code by RamiYim * Version: cs-hhu-cn0.0 * Date: 2014.08.12 * Description: 测试cuda与opencv相结合 * Others: * Function List: main functions and its function * History:<rami>,<20140819>,<添加相关函数>,<desc> <rami>,<20140812>,<创建文件>,<desc>******************************************************************************************************/#include "cv.h"#include "highgui.h"void reverseImage(IplImage *);
/***************************************************************************************************** * File name: reverseImage.cpp * Author: source code by RamiYim * Version: cs-hhu-cn0.0 * Date: 2014.08.12 * Description: 测试cuda与opencv相结合 * Others: * Function List: 实现reverseImage函数 * History:<rami>,<20140819>,<添加相关函数>,<desc> * <rami>,<20140812>,<创建文件>,<desc>******************************************************************************************************/#include "reverseImage.h"#include "cv.h"extern "C" int revImg(const char *, int size);void reverseImage(IplImage *sourceImage){ cvNamedWindow("sourceImage"); cvShowImage("sourceImage", sourceImage); cvWaitKey(0); int width, height, channels, width_step; width = sourceImage -> width; height = sourceImage -> height; channels = sourceImage -> nChannels; width_step = sourceImage -> widthStep; const char *data = sourceImage -> imageData; int size = width * height * channels; revImg(data, size); cvShowImage("reversedImage", sourceImage); cvWaitKey(0); cvDestroyWindow("sourceImage"); cvDestroyWindow("reversedImage");}
#include "cuda_runtime.h"#include "device_launch_parameters.h"#include <stdio.h>#include "cv.h"#include "highgui.h"cudaError_t addWithCuda(char *data, int size);__global__ void revImg(char *dev_c){ int bid = blockIdx.x * gridDim.x + blockIdx.y; //gridDim.x为固定值400,blockIdx.x取值范围为0~399 int tid = bid * blockDim.x + threadIdx.x; //blockDim.x为定值3,threadIdx.x取值范围为0~2 dev_c[tid] = 255 - dev_c[tid]; //实现反转主体功能}extern "C" void revImg(char *data, int size){ cudaError_t cudaStatus = addWithCuda(data, size); if (cudaStatus != cudaSuccess) { fprintf(stderr, "addWithCuda failed!"); }}cudaError_t addWithCuda(char *data, int size) { char *dev_c = 0; cudaError_t cudaStatus; // Choose which GPU to run on, change this on a multi-GPU system. cudaStatus = cudaSetDevice(0); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?"); goto Error; } // Allocate GPU buffers for dev_c cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(char)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } // Copy input vectors from host memory to GPU buffers. cudaStatus = cudaMemcpy(dev_c, data, size * sizeof(char), cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; } // Launch a kernel on the GPU with one thread for each element. dim3 dimGrid(400, 400); dim3 dimBlock(3, 1); //1行3列 revImg<<<dimGrid, dimBlock>>>(dev_c); //调用内核函数 // Check for any errors launching the kernel cudaStatus = cudaGetLastError(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus)); goto Error; } // cudaDeviceSynchronize waits for the kernel to finish, and returns // any errors encountered during the launch. cudaStatus = cudaDeviceSynchronize(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus); goto Error; } // Copy output vector from GPU buffer to host memory. cudaStatus = cudaMemcpy(data, dev_c, size * sizeof(char), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; }Error: cudaFree(dev_c); return cudaStatus;}
以上即为函数的主体功能,结果如下图:
PS:CUDA环境配置见本人博客,地址为:http://blog.csdn.net/a2112233445566/article/details/38420567
OpenCV环境配置件本人博客,地址为:http://blog.csdn.net/a2112233445566/article/details/38540389
0 0
- OpenCV2.4.4+CUDA+VS2010实现图像的反转
- CUDA实现图像反转
- OpenCv2.4.4实现反转(reverse)图像
- CUDA图像旋转的实现
- opencv2.4.10+vs2008实现图像的拼接
- 图像的透视变换(opencv2实现)
- VS2010配置OpenCV2.4.4
- vs2010+opencv2.4.4配置
- opencv2.4.4+VS2010配置
- VS2010配置Opencv2.4.4
- SIFT算法的c++实现(VS2010+OpenCV2.3.1)
- SIFT算法的c++实现(VS2010+OpenCV2.3.1)
- SIFT算法的c++实现(VS2010+OpenCV2.3.1)
- SIFT算法的c++实现(VS2010+OpenCV2.3.1)
- VS2010+Opencv2.4.4+MFC实现人脸检测与识别
- OpenCv2(图像的遍历)
- OpenCV2:图像的直方图
- CUDA实现图像的高斯滤波(opencv实现)
- .NET MVC 入门+连接数据库(SQL SERVER)
- 判断输入的数组是不是某个BST的前序遍历序列
- 单片机之数码管秒表的动态显示
- Oracle12C CDB实例最大创建252个PDB
- linux php环境搭建以及magento安装教程
- OpenCV2.4.4+CUDA+VS2010实现图像的反转
- Framework Manager入门教程(十一) - 决定因素
- Xilinx zynq zc702学习总结 部分内容更正
- 负载均衡组件选型
- java的System.getProperty()方法与 getenv() 方法
- HTTP协议与PHP Socket实现
- HDU 1845 Jimmy’s Assignment(二分图匹配)
- Devstack搭建Openstack时,Ceilometer获取不到信息
- 一张图理解OpenStack Heat的内部调用逻辑