C语言读取图像像素坐标,OpenCL中读取image时的坐标
本文测试OpenCL中读取image数据时关于坐标的两个问题:
使用float2坐标读取
使用int2坐标读取
首先完整的测试代码如下,测试平台为SDM855:
#include
#include
#include
#include
#include "OCL/OPPOOpenCLWrapper.h"
#include "OCL/OCLUtils.h"
#ifndef uchar
#define uchar unsigned char
#endif
const char code[] = R"(
const sampler_t samp1 = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_LINEAR;
__kernel void readtest(read_only image2d_t src, global uchar *dst)
{
int2 coord = (int2)(get_global_id(0), get_global_id(1));
if(coord.x == 0 && coord.y == 0){
printf("(float2)(0.0, 0.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 0.0) ).x * 255.0);
printf("(float2)(0.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.0) ).x * 255.0);
printf("(float2)(0.0, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 1.5) ).x * 255.0);
printf("(float2)(0.0, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.0, 2.0) ).x * 255.0);
printf("(float2)(1.5, 1.5) read:%f \n", read_imagef(src, samp1, (float2)(1.5, 1.5) ).x * 255.0);
printf("(float2)(0.5, 2.0) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.0) ).x * 255.0);
printf("(float2)(0.5, 2.5) read:%f \n", read_imagef(src, samp1, (float2)(0.5, 2.5) ).x * 255.0);
printf("(float2)(1.0, 1.0) read:%f \n", read_imagef(src, samp1, (float2)(1.0, 1.0) ).x * 255.0);
printf("(float2)(254.0, 254.0) read:%f \n", read_imagef(src, samp1, (float2)(254.0, 254.0) ).x * 255.0);
printf("(float2)(255.0, 255.0) read:%f \n", read_imagef(src, samp1, (float2)(255.0, 255.0) ).x * 255.0);
printf("(float2)(255.5, 255.5) read:%f \n", read_imagef(src, samp1, (float2)(255.5, 255.5) ).x * 255.0);
printf("(float2)(256.0, 256.0) read:%f \n", read_imagef(src, samp1, (float2)(256.0, 256.0) ).x * 255.0);
printf("(float2)(300, 300.0) read:%f \n", read_imagef(src, samp1, (float2)(300.0, 300.0) ).x * 255.0);
printf("(int2)(1, 1) read:%f \n", read_imagef(src, samp1, (int2)(1, 1) ).x * 255.0);
printf("(int2)(0, 0) read:%f \n", read_imagef(src, samp1, (int2)(0, 0) ).x * 255.0);
printf("(int2)(1, 2) read:%f \n", read_imagef(src, samp1, (int2)(1, 2) ).x * 255.0);
printf("(int2)(254, 254) read:%f \n", read_imagef(src, samp1, (int2)(254, 254) ).x * 255.0);
printf("(int2)(255, 255) read:%f \n", read_imagef(src, samp1, (int2)(255, 255) ).x * 255.0);
printf("(int2)(256, 256) read:%f \n", read_imagef(src, samp1, (int2)(256, 256) ).x * 255.0);
printf("(int2)(257, 257) read:%f \n", read_imagef(src, samp1, (int2)(257, 257) ).x * 255.0);
}
}
)";
void testsamp05()
{
OPPOOpenCLWrapper ocl;
cl_image_format imageformat;
imageformat.image_channel_data_type = CL_UNORM_INT8;
imageformat.image_channel_order = CL_R;
cl_image_desc imagedesc;
memset(&imagedesc, 0, sizeof(imagedesc));
imagedesc.image_width = 256;
imagedesc.image_height = 256;
imagedesc.image_type = CL_MEM_OBJECT_IMAGE2D;
std::vector data(256*256, 0);
for(int i = 0; i < 256; ++i){
for(int w = 0; w < 256; ++w){
data[i*256+w] = std::max(i, w);
}
}
cl_int err;
cl_mem src = clCreateImage(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, &imageformat, &imagedesc, data.data(), &err);
checkErr(err, "src");
cl_mem dst = clCreateBuffer(ocl.getContext(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, 256*256, NULL, &err);
checkErr(err, "dst");
const char *pcode = code;
cl_program prog = ocl.makeProgram(&pcode, sizeof(code) / sizeof(code[0]));
cl_kernel kernel = ocl.makeKernel(prog, "readtest");
clSetKernelArg(kernel , 0, sizeof(src), &src);
clSetKernelArg(kernel , 1, sizeof(dst), &dst);
size_t globalsize[] = {256, 256} ;
clEnqueueNDRangeKernel(ocl.getCommandQueue(), kernel, 2, NULL, globalsize, NULL, 0, NULL, NULL);
clFinish(ocl.getCommandQueue());
}
我们创建一个宽高都为256的image对象,然后其值设置为当前宽高坐标的大者。同时数据格式为CL_UNORM_INT8,然后使用不同的坐标去读取image对象的值。其结果显示如下:
(float2)(0.0, 0.0) read:0.000000
(float2)(0.0, 1.0) read:0.500000
(float2)(0.0, 1.5) read:1.000000
(float2)(0.0, 2.0) read:1.500000
(float2)(1.5, 1.5) read:1.000000
(float2)(0.5, 2.0) read:1.500000
(float2)(0.5, 2.5) read:2.000000
(float2)(1.0, 1.0) read:0.750000
(float2)(254.0, 254.0) read:253.750000
(float2)(255.0, 255.0) read:254.750000
(float2)(255.5, 255.5) read:255.000000
(float2)(256.0, 256.0) read:255.000000
(float2)(300, 300.0) read:255.000000
(int2)(1, 1) read:1.000000
(int2)(0, 0) read:0.000000
(int2)(1, 2) read:2.000000
(int2)(254, 254) read:254.000000
(int2)(255, 255) read:255.000000
(int2)(256, 256) read:255.000000
(int2)(257, 257) read:255.000000
从上面的结果我们可以看出得知如下信息:
如果读取的时候使用的是float2坐标,假设为坐标为(w, h),那么,其返回的值为(w - 0.5, h - 0.5)处的插值结果,插值的方式为我们常规意义,或者在CPU代码中对该图像进行双线性插值。当然这也和采样器sampler_t对象设置为CLK_FILTER_LINEAR有关。如果其设置为CLK_FILTER_NEAREST,那么肯定就是为最近邻插值了。举例来说,对于(float2)(1.0, 1.0)坐标,其插值目标为(1.0 - 0.5, 1.0 - 0.5),位于(0,0), (0, 1), (1, 0), (1,1)四个像素点中间,根据双线性插值计算。其结果即为0.75
如果读取的时候使用的是int2坐标,那么其坐标与值的关系就和CPU中处理该image一样。
C语言读取图像像素坐标,OpenCL中读取image时的坐标相关推荐
- C#图像处理读取图像像素,根据像素数组绘制图像的方法
前言 对图像进行处理与识别的前提,是先读取图像的像素.而每个像素有R.G.B三种颜色组成,然后对图片中大量的0~255之间的RGB灰度值进行深入分析和处理. 在C#中读取图像像素.根据像素数组绘制图像 ...
- c语言gets,getc,C++_C语言的getc()函数和gets()函数的使用对比,C语言getc()函数:从流中读取字 - phpStudy...
C语言的getc()函数和gets()函数的使用对比 C语言getc()函数:从流中读取字符头文件: #include 函数getc()用于从流中取字符,其原型如下: int getc(FILE *s ...
- C语言读取图像像素坐标,求指导,如何用c语言实现读取*.raw格式图像
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* ** 这个程序是读取jpg图像的 ** 后续加上jpg图像打开和存放 */ #include #include #include #include ...
- r导入txt乱码_R学习笔记系列—R语言从文本和Excel文件中读取数据-excel打开是乱码...
1.4.1 从文本文件中导入数据 可以使用 read.table() 函数从带分隔符的文本文件中导入数.调用格式为: 这个函数看上去很复杂,但其实很多参数在使用时不用明确指出来,使用默认值可以满足绝大 ...
- cv2.imread读取图像结果none_python cv2.imread 读取中文路径的图片返回为None的问题
此篇文章首发于我的csdn博客,见原文链接. 使用cv2读取图片是常见的事情,但如果,输出图片形状大小时出现报错" 'NoneType' object has no attribute sh ...
- 从oracle中读取图片,Pb从oracle中读取和保存图片
Pb从oracle中读取和保存图片 (2008-12-12 12:23:20) 转载 分类:编程 标签: it //保存图片 //选择文件 string pname, fname integer va ...
- php如何逐条读取数据库,php从数据库中读取特定的行(实例)
有的时候我们需要从数据库中读取特定的数据,来检验用户的输入,这个时候需要执行的sql语句是: select * from table_name where id='num'; 需要执行这样的一个语句. ...
- python读取日期_从文件中读取日期和数据(Python)
我想从文件中读取时间字符串和数据,但是当我使用loadtxt时,我不能同时读取字符串和数字,因为字符串不是浮点型的.所以我尝试使用genfromtxt并使用delimiter=[]+[]+[]作为我所 ...
- java读取xml路径问题_java 中读取xml 和绝对路径
一.得到绝对路径 本人用到的不多,就列举常用的. 以上2种可读取固定配置文件可用得到绝对路径 1.System.getProperty("user.dir"); 这个东西局限性十分 ...
最新文章
- 数据库知识点补充::约束
- NYOJ 20 吝啬的国度(深搜)
- 汇编语言——《子程序应用(数制转换)程序设计》实验任务书
- 高考成绩查询接口(转)
- ACL20 | 让笨重的BERT问答匹配模型变快!
- [前台]---js获取input标签中name相同的各个value值
- Python中IOBase详解
- 马拉松教会我_社区教会了我关于开放组织的知识
- c语言教程for,C语言菜鸟基础教程之for循环
- 光模块价格由带宽还是距离决定_5G光模块市场:行“提量降本”之道 走“技术深耕”之途...
- java 封装优化工具,Java开源封装工具
- ubuntu9.10之grub.cfg详解
- 嵌入式系统那些事—脚本语言tcl
- 大一c语言常见编程题,大一c语言考试复习题
- COMSOL Multiphysics 多物理场仿真学习小记
- android pc游戏模拟器哪个好用,哪个电脑手游模拟器好用 安卓手游模拟器测试对比排行榜...
- 7-9 幂集(回溯法) (20 分)(C语言版)
- mac重启之后,中/英 键无法快速切换输入法
- VC++6.0 MFC显示模态对话框和非模态对话框
- Python 简单的龟鱼游戏
热门文章
- 机器学习基础(十二)—— 数学基本理论拾遗
- Linux下c语言实现通讯录,学生通讯录管理系统linux下C语言
- python课程开课吧怎么样-律所:我们更想招这样的人……
- python所有软件-python
- python画柱状图-python 使用 matplotlib.pyplot来画柱状图和饼图
- 从零开始学习python编程-新书推荐《Python3.7从零开始学》来了
- python学来干什么-学python出来到底能干嘛
- 下载python教程-python教程pdf下载
- 学python可以从事什么工作-学完Python后可以从事哪些工作?
- python基础教程菜鸟教程-Python 基础教程