- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Using images of ~8gb or more
1. Copy functions Should work with those sizes ?
2. ErodeBorder
since there is no "In Place" , should i allocate additional temp buffer ?
3. ErodeBorder few iterations
possible to get an example ?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Using images of ~8gb or more
1. Copy functions Should work with those sizes ?
It depends on image parameters. If your image width, height and step does not exceed IPP_MAX_32S, then function should work.
2. ErodeBorder
since there is no "In Place" , should i allocate additional temp buffer ?
Yes, for functions without "I" suffix, you should use temporary buffer if you want to emulate in-place behavior.
3. ErodeBorder few iterations
possible to get an example ?
I don't have C# on my hands but in C++ it could look like this:
#include "ippcv.h"
Status opMorphology_ipp(Image &src, Image &dst)
{
src.ConvertColor(CF_GRAY);
dst = src;
dst.Alloc();
Ipp8u *pSrc = (Ipp8u*)src.ptr();
int srcStep = src.m_step;
Ipp8u *pDst = (Ipp8u*)dst.ptr();
int dstStep = dst.m_step;
Ipp8u *pInter = NULL;
int interStep = 0;
IppiSize size = {src.m_size.width, src.m_size.height};
Ipp8u mask[] = {0, 1, 0,
1, 1, 1,
0, 1, 0};
IppiSize maskSize = {3, 3};
int iterations = 4;
IppStatus status;
IppiMorphState *pState = NULL;
int stateSize = 0;
Ipp8u *pBuffer = NULL;
int bufferSize = 0;
status = ippiMorphologyBorderGetSize_8u_C1R(size, maskSize, &stateSize, &bufferSize);
if(status < 0)
return STS_ERR_FAILED;
pState = (IppiMorphState*)ippMalloc(stateSize);
if(!pState)
return STS_ERR_FAILED;
pBuffer = (Ipp8u*)ippMalloc(bufferSize);
if(bufferSize && !pBuffer)
return STS_ERR_FAILED;
status = ippiMorphologyBorderInit_8u_C1R(size, mask, maskSize, pState, pBuffer);
if(status < 0)
return STS_ERR_FAILED;
if(iterations > 1)
pInter = ippiMalloc_8u_C1(size.width, size.height, &interStep);
status = ippiErodeBorder_8u_C1R(pSrc, srcStep, pDst, dstStep, size, ippBorderRepl, 0, pState, pBuffer);
if(status < 0)
return STS_ERR_FAILED;
for(int i = 1; i < iterations; i++)
{
Ipp8u *pInpl1;
int step1;
Ipp8u *pInpl2;
int step2;
if(i%2)
{
pInpl1 = pDst;
step1 = dstStep;
pInpl2 = pInter;
step2 = interStep;
}
else
{
pInpl1 = pInter;
step1 = interStep;
pInpl2 = pDst;
step2 = dstStep;
}
status = ippiErodeBorder_8u_C1R(pInpl1, step1, pInpl2, step2, size, ippBorderRepl, 0, pState, pBuffer);
if(status < 0)
return STS_ERR_FAILED;
}
if(!(iterations%2))
{
status = ippiCopy_8u_C1R(pInter, interStep, pDst, dstStep, size);
if(status < 0)
return STS_ERR_FAILED;
}
if(pInter)
ippiFree(pInter);
return STS_OK;
}
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page