【发布时间】:2020-11-15 23:09:53
【问题描述】:
我有以下别名
/**
* @typedef PixelPos
* @brief Coordinates of pixel position
*/
using PixelPos = pair<int, int>; /// (row,column)
using ContextTableBase = unordered_map< PixelPos, vector<PixelPos> >; /// (hash(px), list of neighbours)
为了方便,不直接使用unordered_map,而是为了保留实现hash函数所需的信息,定义了一个新的子类。
class ContextTable : public ContextTableBase
{
///... definition of operators and constructor ...
return ContextTableBase::operator[]( PixelPos{ oPixel.first * (height - (height-width)), oPixel.second } );
}
而采用的散列函数是
template<> struct hash<PixelPos>
{
std::size_t operator()(PixelPos const& pixel) const noexcept
{
return pixel.first + pixel.second; /// mapped row + col
}
};
在一个名为 getLocalContext 的函数中,对于由 PixelPos 表示的正方形图像的每个像素(由行和列 - 均为整数 - 排列),我使用函数查找一些邻居 applyMask,如下图所示。
/**
* @brief Función local para aplicar la mascara del contexto local a cada uno de los pixeles
* @param oPosition [in] - px location
* @param oMask [in] - context mask
* @param width [in] - number of columns of the image
* @param height [in] - number of rows of the image
* @param oRet [out] - Return list
* @returns oRet
*/
static void applyMask(const PixelPos& oPosition, const ContextMask& oMask, const int width, const int height, vector<PixelPos>& oRet)
{
for(const auto& dot : oMask )
{
PixelPos oCandidate{ oPosition.first + dot.first, oPosition.second + dot.second };
/// ... do something to check if candidate is neighbour...
oRet.push_back(oCandidate);
/// ... do something else ...
}
}
/// ... more code ...
/**
* @brief Context calculator
* @param N [in] - Context size
* @param width [in] - number of columns of the image
* @param height [in] - number of row of the image
* @returns oTable, hash table which entries are pxs and returns a list of neighbours
*/
ContextTable& getLocalContext(const size_t N, const int width, const int height)
{
ContextTable oTable = new ContextTable(height, width);
ContextMask oMask{ createPixelMask(N) };
for(int row = 0; row < height; ++row)
{
for(int col = 0; col < width; ++col)
{
PixelPos oPosition{ row, col };
if( oTable.find(oPosition) == oTable.end() )
{
vector<PixelPos> oNeighbours{};
applyMask(oPosition, oMask, width, height, oNeighbours);
oTable.insert(make_pair(oPosition, oNeighbours));
}
}
}
return (*oTable);
}
此函数返回的向量是正确的,并且具有我正在寻找的像素,但是在将其添加到 oTable 之后,在离开 getLocalContext 之前,第一行下方像素的条目丢失了.
例如,问题的输出显示为大小为 5x4(行、列)的图像
要插入到 oTable 中的正确值(每次调用 applyMask 后取自 oNeighbours)是
applyMask px central: r: 0| c: 0
applyMask px central: r: 0| c: 1
applyMask n: r: 0| c: 0
applyMask px central: r: 0| c: 2
applyMask n: r: 0| c: 1
applyMask n: r: 0| c: 0
applyMask px central: r: 0| c: 3
applyMask n: r: 0| c: 2
applyMask n: r: 0| c: 1
applyMask px central: r: 1| c: 0
applyMask n: r: 0| c: 0
applyMask n: r: 0| c: 1
applyMask px central: r: 1| c: 1
applyMask n: r: 1| c: 0
applyMask n: r: 0| c: 1
applyMask n: r: 0| c: 0
applyMask n: r: 0| c: 2
applyMask px central: r: 1| c: 2
applyMask n: r: 1| c: 1
applyMask n: r: 0| c: 2
applyMask n: r: 0| c: 1
applyMask n: r: 0| c: 3
applyMask n: r: 1| c: 0
applyMask px central: r: 1| c: 3
applyMask n: r: 1| c: 2
applyMask n: r: 0| c: 3
applyMask n: r: 0| c: 2
applyMask n: r: 1| c: 1
applyMask px central: r: 2| c: 0
applyMask n: r: 1| c: 0
applyMask n: r: 1| c: 1
applyMask px central: r: 2| c: 1
applyMask n: r: 2| c: 0
applyMask n: r: 1| c: 1
applyMask n: r: 1| c: 0
applyMask n: r: 1| c: 2
applyMask px central: r: 2| c: 2
applyMask n: r: 2| c: 1
applyMask n: r: 1| c: 2
applyMask n: r: 1| c: 1
applyMask n: r: 1| c: 3
applyMask n: r: 2| c: 0
applyMask px central: r: 2| c: 3
applyMask n: r: 2| c: 2
applyMask n: r: 1| c: 3
applyMask n: r: 1| c: 2
applyMask n: r: 2| c: 1
applyMask px central: r: 3| c: 0
applyMask n: r: 2| c: 0
applyMask n: r: 2| c: 1
applyMask px central: r: 3| c: 1
applyMask n: r: 3| c: 0
applyMask n: r: 2| c: 1
applyMask n: r: 2| c: 0
applyMask n: r: 2| c: 2
applyMask px central: r: 3| c: 2
applyMask n: r: 3| c: 1
applyMask n: r: 2| c: 2
applyMask n: r: 2| c: 1
applyMask n: r: 2| c: 3
applyMask n: r: 3| c: 0
applyMask px central: r: 3| c: 3
applyMask n: r: 3| c: 2
applyMask n: r: 2| c: 3
applyMask n: r: 2| c: 2
applyMask n: r: 3| c: 1
applyMask px central: r: 4| c: 0
applyMask n: r: 3| c: 0
applyMask n: r: 3| c: 1
applyMask px central: r: 4| c: 1
applyMask n: r: 4| c: 0
applyMask n: r: 3| c: 1
applyMask n: r: 3| c: 0
applyMask n: r: 3| c: 2
applyMask px central: r: 4| c: 2
applyMask n: r: 4| c: 1
applyMask n: r: 3| c: 2
applyMask n: r: 3| c: 1
applyMask n: r: 3| c: 3
applyMask n: r: 4| c: 0
applyMask px central: r: 4| c: 3
applyMask n: r: 4| c: 2
applyMask n: r: 3| c: 3
applyMask n: r: 3| c: 2
applyMask n: r: 4| c: 1
但是,实际存储的值(从 oTable 获取,然后从 getLocalContext 返回)是
px central: r: 0| c: 0
px central: r: 0| c: 1
n: r: 0| c: 0
px central: r: 0| c: 2
n: r: 0| c: 1
n: r: 0| c: 0
px central: r: 0| c: 3
n: r: 0| c: 2
n: r: 0| c: 1
px central: r: 1| c: 0
n: r: 3| c: 0
n: r: 3| c: 1
px central: r: 1| c: 1
n: r: 4| c: 0
n: r: 3| c: 1
n: r: 3| c: 0
n: r: 3| c: 2
px central: r: 1| c: 2
n: r: 4| c: 1
n: r: 3| c: 2
n: r: 3| c: 1
n: r: 3| c: 3
n: r: 4| c: 0
px central: r: 1| c: 3
n: r: 4| c: 2
n: r: 3| c: 3
n: r: 3| c: 2
n: r: 4| c: 1
px central: r: 2| c: 0
px central: r: 2| c: 1
px central: r: 2| c: 2
px central: r: 2| c: 3
px central: r: 3| c: 0
px central: r: 3| c: 1
px central: r: 3| c: 2
px central: r: 3| c: 3
px central: r: 4| c: 0
px central: r: 4| c: 1
px central: r: 4| c: 2
px central: r: 4| c: 3
【问题讨论】:
-
(height - (height-width))等于width。你是这个意思吗?看起来很奇怪。
标签: c++ algorithm data-structures memory-management stl