- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi.
Unfotunately, all the examples for Optical flow are using 8u images. The problem I'm having is that the IppiPyramid struct contains 8u Image pointers and I'm using 32f images. I found a threadhttp://software.intel.com/en-us/forums/showthread.php?t=68034&o=a&s=lrthat discusses this; however, the answer is not really helpful.
How do I perform optical flow on 32bit images?
[cpp] IppiPyramid *pPyr1;
IppiPyramid *pPyr2;
IppiOptFlowPyrLK *pOF;
ippiPyramidInitAlloc (&pPyr1, num_levels, ROI, rate);
ippiPyramidInitAlloc (&pPyr2, num_levels, ROI, rate);
IppiPyramidDownState_32f_C1R** pState1 = (IppiPyramidDownState_32f_C1R**)&(pPyr1->pState);
IppiPyramidDownState_32f_C1R** pState2 = (IppiPyramidDownState_32f_C1R**)&(pPyr2->pState);
Ipp32f** pImg1 = (Ipp32f**)pPyr1->pImage;
Ipp32f** pImg2 = (Ipp32f**)pPyr2->pImage;
int *pStep1 = pPyr1->pStep;
int *pStep2 = pPyr2->pStep;
IppiSize *pRoi1 = pPyr1->pRoi;
IppiSize *pRoi2 = pPyr2->pRoi;
IppHintAlgorithm hint=ippAlgHintFast;
int i;
int level = pPyr1->level;
ippiPyramidLayerDownInitAlloc_32f_C1R(pState1, ROI, rate, pKernel, kerSize, IPPI_INTER_LINEAR);
ippiPyramidLayerDownInitAlloc_32f_C1R(pState2, ROI, rate, pKernel, kerSize, IPPI_INTER_LINEAR);
pImg1[0] = Img1Ptr; //32f image
pImg2[0] = Img2Ptr;//32f image
pStep1[0] = Img1StepBytes;//32f image
pStep2[0] = Img2StepBytes;//32f image
pRoi1[0] = pRoi2[0] = ROI;
// error C2440: '=' : cannot convert from 'Ipp32f *' to 'Ipp8u *'
for (i = 1; i <= level; i++)
{
pPyr1->pImage = (Ipp32f*)ippiMalloc_32f_C1(pRoi1.width, pRoi1.height, pStep1 + i * sizeof(Ipp32f));
pPyr2->pImage = (Ipp32f*)ippiMalloc_32f_C1(pRoi2.width, pRoi2.height, pStep2 + i * sizeof(Ipp32f));
ippiPyramidLayerDown_32f_C1R(pImg1[i-1], pStep1[i-1], pRoi1[i-1], pImg1, pStep1, pRoi1, *pState1);
ippiPyramidLayerDown_32f_C1R(pImg2[i-1], pStep2[i-1], pRoi2[i-1], pImg2, pStep2, pRoi2, *pState2);
}[/cpp]
I've tried to simply cast the pointers to 32f but I'm getting an error. If I just cast that to Ipp8u, the memory location should still be the same which should fix the error. How do I setpStep1?? Would it not be set to 8u spacing byippiPyramidInitAlloc?
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
ippiPyramidLayerDown_32f_C1R(pImg2[i-1], pStep2[i-1], pRoi2[i-1], pImg2, pStep2, pRoi2, *pState2);
This is returning ippStsStepErr = -14, /* Step value is not valid. */
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Ryan,
You can refer to the example code in IPP reference manual, which is using ippiRyramid with 32f.
Example14-6 shows how different general pyramids functions can be used to create the Gaussian and Laplacian pyramids: ( I attached it at the end of message).
For example, please note the code i mark as Bold.
1) Regarding "The IppiPyramid contains pointers to 8 bit unsigned Images", Please see the structure,
typedef struct _IppiPyramid {
Ipp8u **pImage;
IppiSize *pRoi;
Ipp64f *pRate;
int *pStep;
Ipp8u *pState;
int level;
} IppiPyramid;
Here the pionteris actually ** pointer. And the cost happen in
Ipp32** pImg1 = (Ipp32f**)pPyr1->pImage;
Ipp32f** pImg2 = (Ipp32f**)pPyr2->pImage;
And then use the pointer array pImg1[] instead of pPyr1->pImage.
for (i = 1; i <= level; i++)
{
pImg1 = ippiMalloc_32f_C1(pRoi1.width, pRoi1.height, pStep1 + i);//(Ipp32f*)
pImg2 = ippiMalloc_32f_C1(pRoi2.width, pRoi2.height, pStep2 + i);//(Ipp32f*)
sts = ippiPyramidLayerDown_32f_C1R(pImg1[i-1], pStep1[i-1], pRoi1[i-1], pImg1, pStep1, pRoi1, *pState1);
sts = ippiPyramidLayerDown_32f_C1R(pImg2[i-1], pStep2[i-1], pRoi2[i-1], pImg2, pStep2, pRoi2, *pState2);
}
Regarding the wrong steps, as pStep1 is a pointer, The address ofpStep1[1]=pStep+1 (not related to imagedatatype)
After change the two place, you will get your code work.
Best Regards,
Ying
You can refer to the example code in IPP reference manual, which is using ippiRyramid with 32f.
Example14-6 shows how different general pyramids functions can be used to create the Gaussian and Laplacian pyramids: ( I attached it at the end of message).
For example, please note the code i mark as Bold.
1) Regarding "The IppiPyramid contains pointers to 8 bit unsigned Images", Please see the structure,
typedef struct _IppiPyramid {
Ipp8u **pImage;
IppiSize *pRoi;
Ipp64f *pRate;
int *pStep;
Ipp8u *pState;
int level;
} IppiPyramid;
Here the pionteris actually ** pointer. And the cost happen in
Ipp32** pImg1 = (Ipp32f**)pPyr1->pImage;
Ipp32f** pImg2 = (Ipp32f**)pPyr2->pImage;
And then use the pointer array pImg1[] instead of pPyr1->pImage.
for (i = 1; i <= level; i++)
{
pImg1 = ippiMalloc_32f_C1(pRoi1.width, pRoi1.height, pStep1 + i);//(Ipp32f*)
pImg2 = ippiMalloc_32f_C1(pRoi2.width, pRoi2.height, pStep2 + i);//(Ipp32f*)
sts = ippiPyramidLayerDown_32f_C1R(pImg1[i-1], pStep1[i-1], pRoi1[i-1], pImg1, pStep1, pRoi1, *pState1);
sts = ippiPyramidLayerDown_32f_C1R(pImg2[i-1], pStep2[i-1], pRoi2[i-1], pImg2, pStep2, pRoi2, *pState2);
}
Regarding the wrong steps, as pStep1 is a pointer, The address ofpStep1[1]=pStep+1 (not related to imagedatatype)
After change the two place, you will get your code work.
Best Regards,
Ying
Example of Using General Pyramid Functions
The following Example14-6 shows how different general pyramids functions can be used to create the Gaussian and Laplacian pyramids:
Building Gaussian and Laplacian Pyramids
void UsePyramids(Ipp32f *pSrc, IppiSize srcRoi, int srcStep, Ipp32f *pkernel, int kerSize) {
float rate = 2.0f;
IppiPyramid *gPyr; // pointer to Gaussian pyramid structure
IppiPyramid *lPyr; // pointer to Laplacian pyramid structure
// allocate pyramid structures
ippiPyramidInitAlloc (&gPyr, 1000, srcRoi, rate);
ippiPyramidInitAlloc (&lPyr, 1000, srcRoi, rate);
{
int i;
IppiPyramidDownState_32f_C1R **gState = (IppiPyramidDownState_32f_C1R**)&(gPyr->pState);
IppiPyramidUpState_32f_C1R **lState = (IppiPyramidUpState_32f_C1R**) &(lPyr->pState);
Ipp32f **gImage = (Ipp32f**)(gPyr->pImage);
Ipp32f **lImage = (Ipp32f**)(lPyr->pImage);
IppiSize *pRoi = gPyr->pRoi;
int *gStep = gPyr->pStep;
int *lStep = lPyr->pStep;
int level = gPyr->level;
Ipp32f *ptr;
int step;
// allocate structures to calculate pyramid layers
ippiPyramidLayerDownInitAlloc_32f_C1R (gState, srcRoi, rate, pkernel, kerSize, IPPI_INTER_LINEAR);
ippiPyramidLayerUpInitAlloc_32f_C1R (lState, srcRoi, rate, pkernel, kerSize, IPPI_INTER_LINEAR);
// build Gaussian pyramid with level+1 layers
gImage[0] = pSrc;
gStep[0] = srcStep;
for (i=1; i<=level;i++) {
gImage = ippiMalloc_32f_C1(pRoi.width,pRoi.height,gStep+i);
ippiPyramidLayerDown_32f_C1R (gImage[i-1], gStep[i-1], pRoi[i-1], gImage, gStep, pRoi, *gState);
}
// build Laplacian pyramid with level layers
ptr = ippiMalloc_32f_C1(srcRoi.width,srcRoi.height,&step);
for (i=level-1; i>=0; i--) {
lImage = ippiMalloc_32f_C1(pRoi.width,pRoi.height,lStep+i);
ippiPyramidLayerUp_32f_C1R(gImage[i+1], gStep[i+1], pRoi[i+1], ptr, step, pRoi, *lState);
ippiSub_32f_C1R(ptr, step, gImage, gStep, lImage, lStep, pRoi);
}
ippiFree(ptr);
ippiPyramidLayerDownFree_32f_C1R(*gState);
ippiPyramidLayerUpFree_32f_C1R(*lState);
// use Gaussian and Laplacian pyramids
// free allocated images
for (i=1; i<=level; i++) {
ippiFree(gImage);
ippiFree(lImage[i-1]);
}
}
// free pyramid structures
ippiPyramidFree (gPyr);
ippiPyramidFree (lPyr);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you Ying!
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page