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 ...
随机推荐
- oc78--NSFileManager
// main.m // NSFileManager #import <Foundation/Foundation.h> int main(int argc, const char * a ...
- oc75--不可变字典NSDictionary
// // main.m // NSDictionary // // #import <Foundation/Foundation.h> int main(int argc, const ...
- SQLServer添加链接服务器
右键,添加链接服务器 在安全里面输入用户名和密码 添加成功之后的使用方法 select * from [192.168.1.63,3326].[数据库].[dbo].[表]
- B1068 [SCOI2007]压缩 区间dp
这个题我状态想对了,但是转移错了...dp的代码难度都不大,但是思考含量太高了..不会啊,我太菜了. 其实这个题就是一个正常的区间dp,中间多了一个特判的转移就行了. 题干: Description ...
- poj3463 Sightseeing——次短路计数
题目:http://poj.org/problem?id=3463 次短路计数问题,在更新最短路的同时分类成比最短路短.长于最短路而短于次短路.比次短路长三种情况讨论一下,更新次短路: 然而其实不必被 ...
- bzoj3550
费用流+线性规划 搞了很长时间... 我们可以设立式子,a[1]+a[2]+a[3]+...+a[n]<=k , ... , a[2 * n + 1]+ ... +a[3*n]<=k a是 ...
- vue动态绑定class的最常用几种方式
vue动态绑定class的最常用几种方式: 第一种:(最简单的绑定) 1.绑定单个class html部分: <div :class="{'active':isActive}&quo ...
- Gold Coins
http://poj.org/problem?id=2000 #include<stdio.h> ; int main() { int coin[N]; ,j,k; j = ; k = ; ...
- 湖南集训day5
难度:☆☆☆☆☆☆☆ /* 二分答案 算斜率算截距巴拉巴拉很好推的公式 貌似没这么麻烦我太弱了...... 唉不重要... */ #include<iostream> #include&l ...
- 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]
[题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...