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 ...
随机推荐
- 8.30 "我什么都不会"
/* 抢名额第一场 GG "我什么都不会阿" 这场磕死在E题了 按说应该能想到费马小定理 毕竟p is a prime 别的队都过了 大家都比较熟悉的就只有这一个 然后还有I题一开 ...
- research plan
- bzoj1143: [CTSC2008]祭祀river && bzoj27182718: [Violet 4]毕业旅行
其实我至今不懂为啥强联通缩点判入度会错... 然后这个求的和之前那道组合数学一样,就是最长反链=最小链覆盖=最大独立集. #include<cstdio> #include<iost ...
- CodeForces - 557D Vitaly and Cycle(二分图)
Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- bzoj1607 [Usaco2008 Dec]Patting Heads 轻拍牛头——暴力
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1607 观察一下数据范围,就是纯粹的暴力. 代码如下: #include<iostrea ...
- 51nod 1577 线性基
思路: http://blog.csdn.net/yxuanwkeith/article/details/53524757 //By SiriusRen #include <bits/stdc+ ...
- Android 显示意图和隐式意图的区别
意图在android的应用开发中是很重要的,明白了意图的作用和使用后,对开发会有很大帮助.如果没有把意图搞懂,以后开发应用会感觉缺些什么. 意图的作用: 1.激活组件 ...
- Java—break跳出语句
在开发代码时,常常会产生这样的疑惑:break跳出语句是如何应用的呢? 使用break的场景有两种:一.switch语句中.二.循环语句. 这里就不介绍switch语句,主要说一下break在循环中的 ...
- Kotlin实例----android5.0新特性之palette
一.Palette的使用 使用Palette可以让我们从一张图片中拾取颜色,将拾取到的颜色赋予ActionBar,StatusBar以及UI背景色可以让界面色调实现统一或者加载不同图片时同步变化色调 ...
- Python爬取贴吧中的图片
#看到贴吧大佬在发图,准备盗一下 #只是爬取一个帖子中的图片 1.先新建一个scrapy项目 scrapy startproject TuBaEx 2.新建一个爬虫 scrapy genspider ...