3

我正在使用 Cimg 库进行图像处理工作。我有一个由 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 循环并提高速度吗?谢谢大家。

4

4 回答 4

2

You can do something as simple as :

img._data = ptr;

But beware, the ordering of values in the pixel buffer may be different from what you have in the input buffer, that could result in a strange looking image.

于 2013-11-19T13:15:49.910 回答
0

最后我决定切换到opencv。这样,指针可以很容易地分配给图像垫,然后存储在图像中。

我仍在寻找cimg的解决方案。我觉得 cimg 的指针不能修改有点奇怪。

于 2013-11-15T19:20:14.310 回答
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

于 2019-11-18T11:41:43.783 回答
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;
}
于 2016-03-18T17:31:47.823 回答