boost :: gil Interleaved_view

Xzh*_*hsh 3 c++ png boost-gil

我在搞清楚图像库时遇到了一些麻烦.

我找不到关于如何使用boost :: gil库中包含的interleaved_view函数的任何确切文档.更具体地说,我不确切知道原始数据应该存储在哪种二进制格式中.

我能找到的唯一提到的是在gil教程中:

// Calling with 8-bit RGB data into 16-bit BGR
void XGradientRGB8_BGR16(const unsigned char* src_pixels, ptrdiff_t src_row_bytes, int w, int h,
                                 signed short* dst_pixels, ptrdiff_t dst_row_bytes) {
    rgb8c_view_t  src = interleaved_view(w,h,(const rgb8_pixel_t*)src_pixels,src_row_bytes);
    rgb16s_view_t dst = interleaved_view(w,h,(    rgb16s_pixel_t*)dst_pixels,dst_row_bytes);
    x_gradient(src,dst);
}
Run Code Online (Sandbox Code Playgroud)

此外,功能原型说

template<typename Iterator>
type_from_x_iterator< Iterator>::view_t     
boost::gil::interleaved_view (std::size_t width, std::size_t height, Iterator pixels, std::ptrdiff_t rowsize_in_bytes)
//Constructing image views from raw interleaved pixel data. 
Run Code Online (Sandbox Code Playgroud)

我的问题是,gil在二进制格式中期望的格式是什么,以及rowsize_in_bytes应该是什么?

我之前看过交错图像的唯一一次是使用OpenGL,这只是每个像素彼此相邻存储的RGB信息.我认为rowsize_in_bytes只是字面上一行像素的大小,所以我尝试用这样写一个PNG:

void makeImage(const string fileName, const unsigned char * src, const int w, const int h) {
    rgb8c_view_t outImage = interleaved_view(w,h, (const rgb8_pixel_t*) src, w*3*sizeof(unsigned char));
    boost::gil::png_write_view(fileName,outImage);
}
Run Code Online (Sandbox Code Playgroud)

输入src是一个大小为w*h的格式的平面数组

(char)R, (char)G, (char)B, (char)R, (char)G, (char)B, (char)R, (char)G, (char)B ...
Run Code Online (Sandbox Code Playgroud)

图像只是黑色背景上的白色框.但是,我得到的结果相当......奇怪

结果

如果有人知道为什么会这样,以及interleaved_view实际上是如何工作的,那就太好了.提前致谢!

编辑:对不起伙计们,我刚刚意识到我的愚蠢错误.我现在正在工作...... :(问题不在于图像的格式,而在于它是行主要,而不是列专业

Xzh*_*hsh 7

对不起,伙计们,我刚发布后立即意识到我一直在使用matlab太长时间了......我用列主要形式编写了数组...呃我觉得愚蠢

  • +1用于承认您的错误并撰写有关它的答案.别担心,其他人可能犯同样的错误并认为这有用. (2认同)