cuda npp库旋转图片
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <windows.h>
#include <FreeImage.h>
#include <cuda_runtime.h>
#include <npp.h> #pragma comment(lib, "FreeImage.lib")
#pragma comment(lib, "cudart.lib")
#pragma comment(lib, "nppi.lib") FIBITMAP* LoadImg( const char* szFile )
{
FREE_IMAGE_FORMAT nFif; if ( szFile == NULL || *szFile == )
{
return NULL;
} if ( ( nFif = FreeImage_GetFileType( szFile, ) ) == FIF_UNKNOWN )
{
if ( ( nFif = FreeImage_GetFIFFromFilename( szFile ) ) == FIF_UNKNOWN )
{
return NULL;
}
} if ( !FreeImage_FIFSupportsReading( nFif ) )
{
return NULL;
} return FreeImage_Load( nFif, szFile );
} int main( int argc, char* argv[] )
{
cudaError_t cuRet;
NppStatus nppRet;
BOOL fiRet;
FIBITMAP* pSrcBmp;
FIBITMAP* pDstBmp;
unsigned char* pSrcData;
unsigned char* pDstData;
Npp8u* pSrcDataCUDA;
Npp8u* pDstDataCUDA;
NppiSize oSrcSize;
NppiSize oDstSize;
NppiRect oSrcROI;
NppiRect oDstROI;
int nImgBpp;
int nSrcPitch;
int nDstPitch;
int nSrcPitchCUDA;
int nDstPitchCUDA;
double aBoundingBox[][];
double nAngle; if ( argc < )
{
return -;
} /* 载入文件 */
pSrcBmp = LoadImg( argv[] );
assert( pSrcBmp != NULL ); nImgBpp = ( FreeImage_GetBPP( pSrcBmp ) >> );
pSrcData = FreeImage_GetBits( pSrcBmp ); oSrcSize.width = ( int )FreeImage_GetWidth( pSrcBmp );
oSrcSize.height = ( int )FreeImage_GetHeight( pSrcBmp );
nSrcPitch = ( int )FreeImage_GetPitch( pSrcBmp ); oSrcROI.x = oSrcROI.y = ;
oSrcROI.width = oSrcSize.width;
oSrcROI.height = oSrcSize.height; nAngle = atof( argv[] ); /* 设置显卡,构建上下文 */
cuRet = cudaSetDevice( );
assert( cuRet == cudaSuccess ); /* 分配显存 */
switch ( nImgBpp )
{
case :
pSrcDataCUDA = nppiMalloc_8u_C1( oSrcSize.width, oSrcSize.height, &nSrcPitchCUDA );
break;
case :
pSrcDataCUDA = nppiMalloc_8u_C3( oSrcSize.width, oSrcSize.height, &nSrcPitchCUDA );
break;
case :
pSrcDataCUDA = nppiMalloc_8u_C4( oSrcSize.width, oSrcSize.height, &nSrcPitchCUDA );
break;
default:
assert( );
break;
}
assert( pSrcDataCUDA != NULL ); /* 将原图传入显存 */
cudaMemcpy2D( pSrcDataCUDA, nSrcPitchCUDA, pSrcData, nSrcPitch, oSrcSize.width * nImgBpp, oSrcSize.height, cudaMemcpyHostToDevice ); /* 计算旋转后长宽 */
nppiGetRotateBound( oSrcROI, aBoundingBox, nAngle, , );
oDstSize.width = ( int )ceil( fabs( aBoundingBox[][] - aBoundingBox[][] ) );
oDstSize.height = ( int )ceil( fabs( aBoundingBox[][] - aBoundingBox[][] ) ); /* 建目标图 */
pDstBmp = FreeImage_Allocate( oDstSize.width, oDstSize.height, nImgBpp << );
assert( pDstBmp != NULL ); pDstData = FreeImage_GetBits( pDstBmp ); nDstPitch = ( int )FreeImage_GetPitch( pDstBmp );
oDstROI.x = oDstROI.y = ;
oDstROI.width = oDstSize.width;
oDstROI.height = oDstSize.height; /* 分配显存 */
switch ( nImgBpp )
{
case :
pDstDataCUDA = nppiMalloc_8u_C1( oDstSize.width, oDstSize.height, &nDstPitchCUDA );
break;
case :
pDstDataCUDA = nppiMalloc_8u_C3( oDstSize.width, oDstSize.height, &nDstPitchCUDA );
break;
case :
pDstDataCUDA = nppiMalloc_8u_C4( oDstSize.width, oDstSize.height, &nDstPitchCUDA );
break;
}
assert( pDstDataCUDA != NULL );
cudaMemset2D( pDstDataCUDA, nDstPitchCUDA, , oDstSize.width * nImgBpp, oDstSize.height ); /* 处理 */
switch ( nImgBpp )
{
case :
nppRet = nppiRotate_8u_C1R( pSrcDataCUDA, oSrcSize, nSrcPitchCUDA, oSrcROI,
pDstDataCUDA, nDstPitchCUDA, oDstROI,
nAngle, - aBoundingBox[][], - aBoundingBox[][], NPPI_INTER_CUBIC );
break;
case :
nppRet = nppiRotate_8u_C3R( pSrcDataCUDA, oSrcSize, nSrcPitchCUDA, oSrcROI,
pDstDataCUDA, nDstPitchCUDA, oDstROI,
nAngle, - aBoundingBox[][], - aBoundingBox[][], NPPI_INTER_CUBIC );
break;
case :
nppRet = nppiRotate_8u_C4R( pSrcDataCUDA, oSrcSize, nSrcPitchCUDA, oSrcROI,
pDstDataCUDA, nDstPitchCUDA, oDstROI,
nAngle, - aBoundingBox[][], - aBoundingBox[][], NPPI_INTER_CUBIC );
break;
}
assert( nppRet == NPP_NO_ERROR ); cudaMemcpy2D( pDstData, nDstPitch, pDstDataCUDA, nDstPitchCUDA, oDstSize.width * nImgBpp, oDstSize.height, cudaMemcpyDeviceToHost ); fiRet = FreeImage_Save( FIF_BMP, pDstBmp, "ret.bmp" );
assert( fiRet ); nppiFree( pSrcDataCUDA );
nppiFree( pDstDataCUDA ); cudaDeviceReset(); FreeImage_Unload( pSrcBmp );
FreeImage_Unload( pDstBmp ); return ;
}
下面是所有通道的,扩展了一点。以后自己用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <windows.h> #include <FreeImage.h> #include <cuda_runtime.h>
#include <npp.h> int main( int argc, char* argv[] )
{
cudaError_t cuRet;
NppStatus nppRet;
BOOL fiRet;
FIBITMAP* pSrcBmp;
FIBITMAP* pDstBmp;
unsigned char* pSrcData;
unsigned char* pDstData;
Npp8u* pSrcDataCUDA;
Npp8u* pDstDataCUDA;
NppiSize oSrcSize;
NppiSize oDstSize;
NppiRect oSrcROI;
NppiRect oDstROI;
int nSrcPitch;
int nDstPitch;
int nSrcPitchCUDA;
int nDstPitchCUDA;
double aBoundingBox[][];
double nAngle; /* 设置显卡,构建上下文 */
cuRet = cudaSetDevice( );
assert( cuRet == cudaSuccess ); /* 打开文件 */
pSrcBmp = FreeImage_Load( FIF_BMP, "1.bmp" );
assert( pSrcBmp != NULL ); pSrcData = FreeImage_GetBits( pSrcBmp );
assert( pSrcData != NULL ); oSrcSize.width = ( int )FreeImage_GetWidth( pSrcBmp );
oSrcSize.height = ( int )FreeImage_GetHeight( pSrcBmp );
nSrcPitch = ( int )FreeImage_GetPitch( pSrcBmp ); oSrcROI.x = oSrcROI.y = ;
oSrcROI.width = oSrcSize.width;
oSrcROI.height = oSrcSize.height; nAngle = ; /* 分配显存 */
pSrcDataCUDA = nppiMalloc_8u_C1( oSrcSize.width, oSrcSize.height, &nSrcPitchCUDA );
assert( pSrcDataCUDA != NULL ); /* 计算旋转后长宽 */
nppiGetRotateBound( oSrcROI, aBoundingBox, nAngle, , );
oDstSize.width = ( int )ceil( fabs( aBoundingBox[][] - aBoundingBox[][] ) );
oDstSize.height = ( int )ceil( fabs( aBoundingBox[][] - aBoundingBox[][] ) ); /* 建目标图 */
pDstBmp = FreeImage_Allocate( oDstSize.width, oDstSize.height, );
assert( pDstBmp != NULL ); pDstData = FreeImage_GetBits( pDstBmp ); nDstPitch = ( int )FreeImage_GetPitch( pDstBmp );
oDstROI.x = oDstROI.y = ;
oDstROI.width = oDstSize.width;
oDstROI.height = oDstSize.height; /* 分配显存 */
pDstDataCUDA = nppiMalloc_8u_C1( oDstSize.width, oDstSize.height, &nDstPitchCUDA );
assert( pDstDataCUDA != NULL ); cudaMemcpy2D( pSrcDataCUDA, nSrcPitchCUDA, pSrcData, nSrcPitch, oSrcSize.width, oSrcSize.height, cudaMemcpyHostToDevice );
cudaMemset2D( pDstDataCUDA, nDstPitchCUDA, , oDstSize.width, oDstSize.height ); /* 处理 */
nppRet = nppiRotate_8u_C1R( pSrcDataCUDA, oSrcSize, nSrcPitchCUDA, oSrcROI,
pDstDataCUDA, nDstPitchCUDA, oDstROI,
nAngle, - aBoundingBox[][], - aBoundingBox[][], NPPI_INTER_CUBIC );
assert( nppRet == NPP_NO_ERROR ); cudaMemcpy2D( pDstData, nDstPitch, pDstDataCUDA, nDstPitchCUDA, oDstSize.width, oDstSize.height, cudaMemcpyDeviceToHost ); fiRet = FreeImage_Save( FIF_BMP, pDstBmp, "2.bmp" );
assert( fiRet ); nppiFree( pSrcDataCUDA );
nppiFree( pDstDataCUDA ); cudaDeviceReset(); FreeImage_Unload( pSrcBmp );
FreeImage_Unload( pDstBmp ); return ;
}
cuda npp库旋转图片的更多相关文章
- python中用Pillow库进行图片处理
一.Python中 PIL 图像处理库简介 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图, ...
- 【Thumbnailator】java 使用Thumbnailator实现等比例缩放图片,旋转图片等【转载】
Thumbnailator概述: Thumbnailator是与Java界面流畅的缩略图生成库.它简化了通过提供一个API允许精细的缩略图生成调整生产从现有的图像文件的缩略图和图像对象的过程, ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- Android开源库--PhotoView图片查看
如果说我比别人看得更远些,那是因为我站在了巨人的肩上. github地址:https://github.com/chrisbanes/PhotoView 介绍 在一般的应用中,总会遇到查看图片的功能, ...
- Camera图片特效处理综述(Bitmap的Pixels处理、Canvas/paint的drawBitmap处理、旋转图片、裁截图片、播放幻灯片浏览图片<线程固定时间显示一张>)
一种是直接对Bitmap的像素进行操作,如:叠加.边框.怀旧.(高斯)模糊.锐化(拉普拉斯变换). Bitmap.getPixels(srcPixels, 0, width, 0, 0, width, ...
- exif.js 旋转图片
还是那个问题:网上的大胸弟们BB一大堆,没几个给的代码能用的,话不多说,直接上demo: 链接:https://pan.baidu.com/s/1jJ6vnt8 密码:swwm 不要忽视demo中的s ...
- vue 添加旋转图片 修改css transform 值
//点击放大图片并旋转图片 conponents组建 <template> <!-- 过渡动画 --> <transition name="fade ...
- JQ 实现轮播图(3D旋转图片轮播效果)
轮播图效果如下: 代码: <!DOCTYPE html> <html xmlns="/www.w3.org/1999/xhtml"> <head> ...
- php 简单的学习GD库绘制图片并传回给前端实现方式
1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...
随机推荐
- jenkins对接gitlab和git
1 需要的插件 jenkins的git插件和jenkins的gitlab插件. 2 对接gitlab 在系统配置中,随便起一个连接的名字,设置url,可以直接用ip地址,端口号默认是80,不需要写明. ...
- 01-S3C2440学习入门概念+环境搭建【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/54754812 一.心得: 这两年学过很多东西,有点杂,总感觉不够踏实,于是准备写 ...
- HyperLedger Fabric部署与链码解读
1.Fabric简介 Fabric是超级账本中的一个项目,用以推进区块链技术.和其他区块链类似,它也有一个账本,使用智能合约,且是一个参与者可以分别管理自身交易的系统.它是一个联盟链.Fabric与其 ...
- NetCore Netty 框架 BT.Netty.RPC 系列随讲 二 WHO AM I 之 NETTY/NETTY 与 网络通讯 IO 模型之关系?
一:NETTY 是什么? Netty 是什么? 这个问题其实百度上一搜一堆. 这是官方话的描述:Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个 ...
- 【知识总结】回文自动机(Palindrome_Automaton)
参考资料:Palindromic Tree--回文树[处理一类回文串问题的强力工具](请注意,其中似乎有一些错误) 回文自动机似乎和回文树是同一个东西qwq? 回文自动机(PAM)是一种处理回文串的工 ...
- 【CodeForces727E/CF727E】Games on a CD (字符串哈希)
题目: CodeForces727E 分析: 看到字符串比较,肯定想到哈希啊--现学的哈希,先丢两个重要的公式 (\(seed\)是大于字符集大小的质数,\(p\)是大质数) \[hash[i]=(h ...
- 题解报告:hdu 1142 A Walk Through the Forest
题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...
- Parameter index out of range (1 > number of parameters, which is 0).
数据库错误:Parameter index out of range (1 > number of parameters, which is 0) ...
- Hadoop基础(一)
Hadoop 基础知识 大数据已经火了很长很长时间了,从最开始是个公司都说自己公司的数据量很大,我们在搞大数据.到现在大数据真的已经非常成熟并且已经在逐渐的影响我们的生产生活.你可能听过支付宝的金融大 ...
- Java——Spring配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...