template<typename Type>
class parallelCopyToInvoker {
public:
Mat* dstImg;
Mat maskSrc;
void operator()(const blocked_range<int>& range) const {
for (int i = range.begin(); i != range.end(); ++i) {
if (maskSrc.channels()==1)
{
Type* dstRow = dstImg->ptr<Type>(i);
const Type* srcRow = maskSrc.ptr<Type>(i);
for (int j = 0; j < maskSrc.cols; ++j) {
dstRow[j] = srcRow[j]; // 直接使用指针进行赋值
}
}
else if (maskSrc.channels() == 3) {
Type* dstRow = dstImg->ptr<Type>(i);
const Type* srcRow = maskSrc.ptr<Type>(i);
for (int j = 0; j < maskSrc.cols; ++j) {
for (int c = 0; c < maskSrc.channels(); ++c) {
dstRow[maskSrc.channels() * j + c] = srcRow[maskSrc.channels() * j + c];
}
}
}
}
}
};
template <typename Type>
class parallel32BitCopyToInvoker//构造一个供parallel_for使用的循环结构体
{
public:
Mat *dstImg;
Mat maskSrc;
void operator()(const blocked_range<int>& range) const
{
for (int i = range.begin(); i < range.end(); i++)
{
Type* pImageData = reinterpret_cast<Type*>(dstImg->data) + i*dstImg->step / sizeof(Type);
Type* SrcData = reinterpret_cast<Type*>(maskSrc.data) + i*maskSrc.step / sizeof(Type);
if (maskSrc.channels() == 1)
{
Type *pDataPixel = pImageData;
Type *pDataPixelsrc = SrcData;
for (int j = 0; j < maskSrc.cols; j++)
{
Type *pDataPixelsrcJ = pDataPixelsrc + j;
Type *pDataPixelJ = pDataPixel + j;
pDataPixelJ[0] = pDataPixelsrcJ[0];
}
}
if (maskSrc.channels() == 3)
{
Type *pDataPixel = pImageData;
Type *pDataPixelsrc = SrcData;
for (int j = 0; j < maskSrc.cols; j++)
{
Type *pDataPixelsrcJ = pDataPixelsrc + j * 3;
Type *pDataPixelJ = pDataPixel + j * 3;
pDataPixelJ[0] = pDataPixelsrcJ[0];
pDataPixelJ[1] = pDataPixelsrcJ[1];
pDataPixelJ[2] = pDataPixelsrcJ[2];
}
}
}
}
};
opencv使用step和str方式访问图像内容(TBB)
最新推荐文章于 2024-10-06 20:09:31 发布