我正在使用Cimg lib来进行图像处理工作。我有GPU返回的数组的指针,我希望Cimg对象直接获取数组的值。现在,我使用for循环来完成工作,但效率不高。
我现在使用的示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "CImg.h"
using namespace std;
using namespace cimg_library;
int main(){
char pause;
int width=3; int height=3;//Dimension of the Cimg matrix
int size = width * height * sizeof(int); // number of bytes in total in arrays
int *ptr = (int*) malloc(size);
//Assign the array some example value;
for (int m=0;m<width*height;m++){
*(ptr+m)=m;
}
CImg<int> img(width,height,1,1);
//This is how I assign the value of the array to the Cimg object
for (int i=0;i<width;i++)
for (int j=0;j<height;j++)
{
img.atXY(i,j)=*(ptr+j*width+i);
}
img.save_bmp("img.bmp");
cout<<"Pause:";
cin>>pause;
}
}
我厌倦了这段代码,但它不起作用:
img.begin()=ptr;
任何人都可以帮我消除for循环并提高速度吗?提前谢谢大家。
答案 0 :(得分:2)
你可以做一些简单的事情:
img._data = ptr;
但请注意,像素缓冲区中值的排序可能与输入缓冲区中的值不同,这可能会导致图像看起来很奇怪。
答案 1 :(得分:0)
最后我决定切换到opencv。这样,指针可以很容易地分配给图像垫,然后存储在图像中。
我仍在寻找cimg的解决方案。我觉得cimg的指针无法修改似乎有点奇怪。
答案 2 :(得分:0)
来自https://devolio.net/fish2000/cimg-fltkhpp/:
/* Generates a w*h*4 CImg<uchar> image from the given rgb data. */
static inline cimg_library::CImg<uchar> cimg_from_rgba(
uchar const* rgb,
const uint dimw, const uint dimh
)
{
cimg_library::CImg<uchar> res(dimw,dimh,1,4);
uchar *pR = res.data(0,0,0,0),
*pG = res.data(0,0,0,1),
*pB = res.data(0,0,0,2),
*pA = res.data(0,0,0,3);
const uchar *ptrs = rgb;
for ( uint off = dimw*dimh; off>0; --off )
{
*(pR++) = (uchar)*(ptrs++);
*(pG++) = (uchar)*(ptrs++);
*(pB++) = (uchar)*(ptrs++);
*(pA++) = (uchar)*(ptrs++);
}
return res;
}
答案 3 :(得分:0)
现在有可以将指针用作内部存储的构造函数。
例如。
cimg_library::CImg<unsigned char> img(ptr, 640, 480, 1, 3, true);
将最后一个参数设置为true
很重要,因为这表明应该将指针ptr
用作内部存储,而不是从指针中复制值。
更多信息在这里:
http://cimg.eu/reference/structcimg__library_1_1CImg.html#a24f3b43daa4444b94a973c2c3fff82c5