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 ...
随机推荐
- Batch基本知识
一般情况下,每条命令占据一行: 当然也可以将多条命令用特定符号(如:&:.&&:.|.||等)分隔后写入同一行中: 还有的情况就是像if.for等较高级的命令则要占据几行.几十 ...
- ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)
Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原 ...
- 洛谷P1281 书的复制
题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...
- UNIX环境高级编程--9. 进程控制
进程关系 当子进程终止时,父进程得到通知并能取得子进程的退出状态. 终端登录: 早起UNIX系统通过哑终端登录,本地的终端 or 远程的终端 .主机上链接的终端设备是固定的,所以同时登录数 ...
- C#中 分层 显示数据库中多表的数据信息
如下图,要实现将三个表中的内容加载到同一个窗体中,该怎么来实现呢? 要实现上面的查询结果,我们就要从Student表中拿到学生姓名,从Subject表中拿到科目名称,从StudentResult表中拿 ...
- 升级Xcode或 MacOS编译iOS出现resource fork, Finder information, or similar detritus not allowed
很久没有在网上留下足迹了,冒个泡吧 最近升级了Xcode,编译之前的一个项目是出现问题,问题结尾如下: resource fork, Finder information, or similar de ...
- java攻城师之路--复习java web之servlet
需要掌握的知识点:1.Servlet程序编写 ----- 生命周期2.ServletAPI Request Response 3.Cookie 和 Session Servlet 用来 动态web资源 ...
- cmd 启动mysql环境变量配置
win10系统:(其他系统类似,改环境变量就可以) 1.我的电脑,右键选择属性,进入系统页面 2.点击高级系统设置,进入系统属性页面 3.点击高级选项卡,点击环境变量,进入环境变量设置 4.选择系统变 ...
- HDU_1079_思维题
Calendar Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- What is gradle sync in Android Studio?
What is it? And what does it do? Gradle sync is a gradle task that looks through all of your depende ...