CUDA小白 - NPP(6) 图像处理 Geometry Transforms (1)

2023-11-19

cuda小白
原始API链接 NPP

GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》

常见的NppStatus,可以看这里

Resize

图像尺寸的resize操作。

// 指定x和y的resize尺寸
NppStatus nppiResizeSqrPixel_8u_C3R(const Npp8u *pSrc,
									NppiSize oSrcSize,
									int nSrcStep,
									NppiRect oSrcROI,
									Npp8u *pDst,
									int nDstStep,
									NppiRect oDstROI,
									double nXFactor,
									double nYFactor,
									double nXShift,
									double nYShift,
									int eInterpolation);
// x和y的resize尺寸自动计算
NppStatus nppiResize_8u_C3R(const Npp8u *pSrc,
							int nSrcStep,
							NppiSize oSrcSize,
							NppiRect oSrcRectROI,
							Npp8u *pDst,
							int nDstStep,
							NppiSize oDstSize,
							NppiRect oDstRectROI,
							int eInterpolation);	
// 多batch的resize
// 涉及到一个新的数据类型,NppiResizeBatchCXR
NppStatus nppiResizeBatch_8u_C3R(NppiSize oSmallestSrcSize,
								 NppiRect oSrcRectROI,
								 NppiSize oSmallestDstSize,
								 NppiRect oDstRectROI,
								 int eInterpolation,
								 NppiResizeBatchCXR *pBatchList,
								 unsigned int nBatchSize);	
code
#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>

#define CUDA_FREE(ptr) { if (ptr != nullptr) { cudaFree(ptr); ptr = nullptr; } }

int main() {
  std::string directory = "../";
  cv::Mat image_dog = cv::imread(directory + "dog.png");
  int image_width = image_dog.cols;
  int image_height = image_dog.rows;
  int image_size = image_width * image_height;

  // =============== device memory ===============
  // input
  uint8_t *in_image;
  cudaMalloc((void**)&in_image, image_size * 3 * sizeof(uint8_t));
  cudaMemcpy(in_image, image_dog.data, image_size * 3 * sizeof(uint8_t), cudaMemcpyHostToDevice);
  // output
  double scale_w = 1.0 / 4;
  double scale_h = 1.0 / 4;
  uint8_t *out_ptr1, *out_ptr2;
  int dst_width = image_width * scale_w;
  int dst_height = image_height * scale_h;
  cudaMalloc((void**)&out_ptr1, dst_width * dst_height * 3 * sizeof(uint8_t));  // 三通道
  cudaMalloc((void**)&out_ptr2, dst_width * dst_height * 3 * sizeof(uint8_t));  // 三通道

  // roi size
  NppiSize in_size, out_size;
  in_size.width = image_width;
  in_size.height = image_height;
  out_size.width = dst_width;
  out_size.height = dst_height;

  NppiRect rc1, rc2;
  rc1.x = 0;
  rc1.y = 0;
  rc1.width = image_width;
  rc1.height = image_height;
  rc2.x = 0;
  rc2.y = 0;
  rc2.width = dst_width;
  rc2.height = dst_height;

  cv::Mat out_image = cv::Mat::zeros(dst_height, dst_width, CV_8UC3);
  NppStatus status;
  // =============== nppiResizeSqrPixel_8u_C3R ===============
  // resize to half
  status = nppiResizeSqrPixel_8u_C3R(in_image, in_size, image_width * 3, rc1, out_ptr1, 
                                     dst_width * 3, rc2, scale_w, scale_h, 10.0, 50.0, 
                                     NPPI_INTER_LINEAR);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiResizeSqrPixel_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, dst_width * dst_height * 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "resize_sqr.jpg", out_image);

  // =============== nppiResize_8u_C3R ===============
  // resize to half
  status = nppiResize_8u_C3R(in_image, image_width * 3, in_size, rc1, out_ptr2, 
                             dst_width * 3, out_size, rc2, NPPI_INTER_LINEAR);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiResize_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr2, dst_width * dst_height * 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "resize.jpg", out_image);

  // free
  CUDA_FREE(in_image)
  CUDA_FREE(out_ptr1)
  CUDA_FREE(out_ptr2)
}
make
cmake_minimum_required(VERSION 3.20)
project(test)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
file(GLOB CUDA_LIBS "/usr/local/cuda/lib64/*.so")

add_executable(test test.cpp)
target_link_libraries(test
                      ${OpenCV_LIBS}
                      ${CUDA_LIBS}
)
result

请添加图片描述
注意:
1.resizesqr的接口支持x和y不同scale的resize操作,并且可以添加左上角的offset值(result中的x和y分别添加了10像素和50像素的offset)

Remap

重映射,remap实现功能与原始的Opencv的功能一致。

NppStatus nppiRemap_8u_C3R(const Npp8u *pSrc,
							NppiSize oSrcSize,
							int nSrcStep,
							NppiRect oSrcROI,
							const Npp32f *pXMap,
							int nXMapStep,
							const Npp32f *pYMap,
							int nYMapStep,
							Npp8u *pDst,
							int nDstStep,
							NppiSize oDstSizeROI,
							int eInterpolation);
code
#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>

#define CUDA_FREE(ptr) { if (ptr != nullptr) { cudaFree(ptr); ptr = nullptr; } }

int main() {
  std::string directory = "../";
  cv::Mat image_dog = cv::imread(directory + "dog.png");
  int image_width = image_dog.cols;
  int image_height = image_dog.rows;
  int image_size = image_width * image_height;

  // =============== device memory ===============
  // input
  uint8_t *in_image;
  cudaMalloc((void**)&in_image, image_size * 3 * sizeof(uint8_t));
  cudaMemcpy(in_image, image_dog.data, image_size * 3 * sizeof(uint8_t), cudaMemcpyHostToDevice);

  cv::Mat mat_mapx = cv::Mat::zeros(image_height, image_width, CV_32FC1);
  cv::Mat mat_mapy = cv::Mat::zeros(image_height, image_width, CV_32FC1);
  for (int i = 0; i < image_height; ++i) {
    for (int j = 0; j < image_width; ++j) {
      mat_mapx.at<float>(i, j) = (float)j;
      mat_mapy.at<float>(i, j) = (float)(image_height - i - 1);
    }
  }

  float *mapx, *mapy;
  cudaMalloc((void**)&mapx, image_size * sizeof(float));
  cudaMalloc((void**)&mapy, image_size * sizeof(float));
  cudaMemcpy(mapx, mat_mapx.data, image_size * sizeof(float), cudaMemcpyHostToDevice);
  cudaMemcpy(mapy, mat_mapy.data, image_size * sizeof(float), cudaMemcpyHostToDevice);

  // output
  uint8_t *out_ptr1;
  cudaMalloc((void**)&out_ptr1, image_size * 3 * sizeof(uint8_t));  // 三通道

  // size
  NppiSize in_size, out_size;
  in_size.width = image_width;
  in_size.height = image_height;
  out_size.width = image_width;
  out_size.height = image_height;

  NppiRect rc1;
  rc1.x = 0;
  rc1.y = 0;
  rc1.width = image_width;
  rc1.height = image_height;

  cv::Mat out_image = cv::Mat::zeros(image_height, image_width, CV_8UC3);
  NppStatus status;
  // =============== nppiResizeSqrPixel_8u_C3R ===============
  // resize to half
  status = nppiRemap_8u_C3R(in_image, in_size, image_width * 3, rc1, mapx, 
                            image_width * sizeof(float), mapy, image_width * sizeof(float), 
                            out_ptr1, image_width * 3, out_size, NPPI_INTER_LINEAR);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiRemap_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, image_size* 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "remap.jpg", out_image);

  // free
  CUDA_FREE(in_image)
  CUDA_FREE(mapx)
  CUDA_FREE(mapy)
  CUDA_FREE(out_ptr1)
}
make
cmake_minimum_required(VERSION 3.20)
project(test)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
file(GLOB CUDA_LIBS "/usr/local/cuda/lib64/*.so")

add_executable(test test.cpp)
target_link_libraries(test
                      ${OpenCV_LIBS}
                      ${CUDA_LIBS}
)
result

请添加图片描述
注意点:

  1. mapx和mapy的数据类型是NPP32f(float)类型,因此在指定x和y的step的时候需要惩乘上float的字节数,不然出来的结果不对。

Rotate

旋转,该模块除了直接提供旋转的接口,还同步提供了根据角度和品阿姨计算旋转矩阵的接口

// 除了当前接口,还提供了一个返回四元素的接口
NppStatus nppiGetRotateBound(NppiRect oSrcROI,
							 double aBoundingBox[2][2],
							 double nAngle,
							 double nShiftX,
							 double nShiftY);
// 旋转
NppStatus nppiRotate_8u_C3R(const Npp8u *pSrc,
							NppiSize oSrcSize,
							int nSrcStep,
							NppiRect oSrcROI,
							Npp8u *pDst,
							int nDstStep,
							NppiRect oDstROI,
							double nAngle,
							double nShiftX,
							double nShiftY,
							int eInterpolation);
code
#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>

#define CUDA_FREE(ptr) { if (ptr != nullptr) { cudaFree(ptr); ptr = nullptr; } }

int main() {
  std::string directory = "../";
  cv::Mat image_dog = cv::imread(directory + "dog.png");
  int image_width = image_dog.cols;
  int image_height = image_dog.rows;
  int image_size = image_width * image_height;

  // =============== device memory ===============
  // input
  uint8_t *in_image;
  cudaMalloc((void**)&in_image, image_size * 3 * sizeof(uint8_t));
  cudaMemcpy(in_image, image_dog.data, image_size * 3 * sizeof(uint8_t), cudaMemcpyHostToDevice);

  // output
  uint8_t *out_ptr1;
  cudaMalloc((void**)&out_ptr1, image_size * 3 * sizeof(uint8_t));  // 三通道

  // size
  NppiSize in_size, out_size;
  in_size.width = image_width;
  in_size.height = image_height;
  out_size.width = image_width;
  out_size.height = image_height;

  NppiRect rc1;
  rc1.x = 0;
  rc1.y = 0;
  rc1.width = image_width;
  rc1.height = image_height;

  cv::Mat out_image = cv::Mat::zeros(image_height, image_width, CV_8UC3);
  NppStatus status;
  // =============== nppiResizeSqrPixel_8u_C3R ===============
  // resize to half
  double angle = 30.0;
  double shift_x = image_width / 4;
  double shift_y = image_height / 4;
  status = nppiRotate_8u_C3R(in_image, in_size, image_width * 3, rc1, out_ptr1, image_width * 3, 
                             rc1, angle, shift_x, shift_y, NPPI_INTER_LINEAR);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiRemap_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, image_size* 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "rotate.jpg", out_image);

  // free
  CUDA_FREE(in_image)
  CUDA_FREE(out_ptr1)
}
make
cmake_minimum_required(VERSION 3.20)
project(test)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
file(GLOB CUDA_LIBS "/usr/local/cuda/lib64/*.so")

add_executable(test test.cpp)
target_link_libraries(test
                      ${OpenCV_LIBS}
                      ${CUDA_LIBS}
)
result

请添加图片描述

Mirror

主要是用于将图像用于镜像操作。

enum NppiAxis {
	NPP_HORIZONTAL_AXIS,
	NPP_VERTICAL_AXIS,
	NPP_BOTH_AXIS
};
// 新增枚举,用于表示镜像的轴
NppStatus nppiMirror_8u_C3R(const Npp8u *pSrc,
							int nSrcStep,
							Npp8u *pDst,
							int nDstStep,
							NppiSize oROI,
							NppiAxis flip);	
code
#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>

#define CUDA_FREE(ptr) { if (ptr != nullptr) { cudaFree(ptr); ptr = nullptr; } }

int main() {
  std::string directory = "../";
  cv::Mat image_dog = cv::imread(directory + "dog.png");
  int image_width = image_dog.cols;
  int image_height = image_dog.rows;
  int image_size = image_width * image_height;

  // =============== device memory ===============
  // input
  uint8_t *in_image;
  cudaMalloc((void**)&in_image, image_size * 3 * sizeof(uint8_t));
  cudaMemcpy(in_image, image_dog.data, image_size * 3 * sizeof(uint8_t), cudaMemcpyHostToDevice);

  // output
  uint8_t *out_ptr1;
  cudaMalloc((void**)&out_ptr1, image_size * 3 * sizeof(uint8_t));  // 三通道

  NppiSize in_size;
  in_size.width = image_width;
  in_size.height = image_height;

  cv::Mat out_image = cv::Mat::zeros(image_height, image_width, CV_8UC3);
  NppStatus status;
  // =============== nppiMirror_8u_C3R ===============
  status = nppiMirror_8u_C3R(in_image, image_width * 3, out_ptr1, image_width * 3, 
                             in_size, NPP_HORIZONTAL_AXIS);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiMirror_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, image_size* 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "mirror_horizontal.jpg", out_image);

  // =============== nppiMirror_8u_C3R ===============
  status = nppiMirror_8u_C3R(in_image, image_width * 3, out_ptr1, image_width * 3, 
                             in_size, NPP_VERTICAL_AXIS);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiMirror_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, image_size* 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "mirror_vertical.jpg", out_image);

  // =============== nppiMirror_8u_C3R ===============
  status = nppiMirror_8u_C3R(in_image, image_width * 3, out_ptr1, image_width * 3, 
                             in_size, NPP_BOTH_AXIS);
  if (status != NPP_SUCCESS) {
    std::cout << "[GPU] ERROR nppiMirror_8u_C3R failed, status = " << status << std::endl;
    return false;
  }
  cudaMemcpy(out_image.data, out_ptr1, image_size* 3, cudaMemcpyDeviceToHost);
  cv::imwrite(directory + "mirror_both.jpg", out_image);

  // free
  CUDA_FREE(in_image)
  CUDA_FREE(out_ptr1)
}
make
cmake_minimum_required(VERSION 3.20)
project(test)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})
file(GLOB CUDA_LIBS "/usr/local/cuda/lib64/*.so")

add_executable(test test.cpp)
target_link_libraries(test
                      ${OpenCV_LIBS}
                      ${CUDA_LIBS}
)
result

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA小白 - NPP(6) 图像处理 Geometry Transforms (1) 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • PAT (Basic Level) Practice 1033 旧键盘打字 Python

    根据题意 这道题让我们根据要求去除第二行输入的字符串中的部分内容 1 判断上档键是否损坏 以进行下一步处理 2 根据要求去除字符串中特定字符 3 sys模块 可用于大量输入的加速 4 operator 可用于运算时的加速 代码如下 impo
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • 机器学习:多分类的logistic回归

    机器学习 多分类的logistic回归 Multi Class Logistic 多分类的Logistic问题 它适用于那些类别数大于2的分类问题 并且在分类结果中 样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率 也可以说样
  • Unity3D【脚本】 按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板

    按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板 效果图 脚本 using UnityEngine using System Collections public class Exit MonoBehaviour public Game
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • 一篇文章学会使用摩斯密码,简单易懂,你也可以使用“降维打击”

    阅读之前 大家请先看一行符号 看看大家能不能猜出这段符号所代表的含义 相信能看出这段符号含义的人还是占少数 没关系 通过阅读久见菌的这篇文章保证让你能看懂这是什么意思 摩尔斯电码的发明 上面这一串符号就是使用摩尔斯电码打出来的英语单词 摩尔
  • Latex特殊符号大全(高清)

    Latex符号大全 转载内容供自己阅读 原文 Latex特殊符号大全 高清
  • Cmake学习

    Cmake学习 CMake调用boost的编译脚本 cmake minimum required VERSION 3 14 project boost python 设置支持C 11特性 set CMAKE CXX STANDARD 11
  • 鸟哥的Linux私房菜PDF在线阅读

    鸟哥的Linux私房菜在线阅读 我在网上查了好久都没有找到正经的关于鸟哥的linux私房菜的PDF版本 要么就是耍流氓的要钱 给了钱 也不一定能得到完整版的PDF 我也只找到了在线版的 在这里供献出来 仅供大家学习参考之用 至于PDF版的
  • 如何查看linux服务器是否为amd64架构还是x86_64架构

    前言 环境 centos 7 9 我们在下载软件时 软件包后面通常带有amd64的字样 那么如何知道我们的服务器是不是amd64架构呢 下面的这些命令可以查看linux的版本及其他信息 查看linux内核版本 root master cat
  • 计算机网络-应用层协议2(FTP)

    1 文件传输协议 FTP 原理 如图所示 FTP工作原理如下 用户或主机通过FTP用户接口与FTP客户进程交互 该用户首先提供远程主机的主机名 使本地主机的FTP客户进程建立一个到远程FTP服务器进程的TCP连接 紧接着该用户提供用户标识和
  • 各种Java加密算法

    如基本的单向加密算法 BASE64 严格地说 属于编码格式 而非加密算法 MD5 Message Digest algorithm 5 信息摘要算法 SHA Secure Hash Algorithm 安全散列算法 HMAC Hash Me
  • 华为Atlas200dk使用第三步------只用一根网线登录华为开发板

    华为开发板Atlas200DK ARES500DK开发板 开发板使用心得系列文章目录 第三章 一根线登录华为开发板 目录 前言 同时使用网线和串口线连接开发板有点多余 线多显得乱 串口连接开发板也比较繁琐 因此本文给大家提供两种使用一根网线
  • FLutter Error: ADB exited with exit code 1 Performing Streamed Install

    出现这个原因是模拟器存储空间满了没办法安装运行新的应用 打开模拟器界面将原先一些不要的应用卸载了就能安装了
  • C语言中的基本输入输出

    目录 1 字符输出函数putchar 2 字符输入函数getchar 3 格式化输出函数printf 4 格式化输入函数scanf 5 字符串接收函数gets 6 字符串接收函数fgets 7 字符串输出函数puts 8 格式化转换为字符串
  • R语言【数据集的导入导出】

    目录 一 从键盘输入数据 二 函数方法读取 1 读取数据文件 2 从屏幕读取数据 1 scan 2 readline 3 读取固定宽度数据文件 三 读取csv文件 四 读取表格数据文件 五 从网络中读取表格或者CSV数据文件 一 从键盘输入
  • ip地址段分解与合并

    1 为什么要分解和合并ip地址段 无他 工作需要嘛 谁没事去划分ip地址段 优点 可以节省大量的时间 减少算错的可能性 2 工具下载 下载链接 https github com zhanhb cidr merger github在国内使用不
  • 如何查询Oracle数据库的操作日志

    Oracle数据库里有一个专门存储操作的视图 v sqlarea 可以通过它查询历史操作 select t SQL TEXT t FIRST LOAD TIME from v sqlarea t where t SQL TEXT like
  • linux下vbox+chrome os安装体验

    1 安装虚拟机 VirtualBox sudo apt install virtualbox 2 下载chrome OS ISO 文件 http www getchrome eu download 3 过程
  • CUDA小白 - NPP(6) 图像处理 Geometry Transforms (1)

    cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化 具体的可以参考别的博主的介绍 都比较详细 还有一些cuda中的专有名词的含义 可以参考 详解CUDA的Context Stream Warp SM SP Kernel B