读书人

图像拷贝 错位 O_o解决方法

发布时间: 2013-07-01 12:33:04 作者: rapoo

图像拷贝 错位 O_o

自己写了一个这样的函数:

实现将 原始图像 ---src 指向其数据img->imageData, 其中 img是灰度图,其步长为 widStep
中 rect 区域 拷贝到 dst 中。。。。

void copyData(void * src, int widStep, void * dst, void *  rect)
{
ScRect* r = (ScRect*)rect;
int i = 0, j = 0;
unsigned char* pSrc = (unsigned char*)src;
unsigned char* pDes = (unsigned char*)dst;
for(i = r->y; i < r->y + r->h;i ++)
{
pSrc = (unsigned char*)src+ i * widStep + r->x;
for(j = 0;j < r->w;j++)
{
*pDes++ = *pSrc++;
}
}

r = NULL;
}



测试:
int main()
{
IplImage *img = cvLoadImage("D:\\vv.jpg", 0);
CvRect r = cvRect(0, 0, 200, 200);
IplImage *eye = cvCreateImage(cvSize(200, 200), 8, 1);
copyData((void *)img->imageData, img->widthStep , eye->imageData, &r);
cvShowImage("eye", eye);
cvWaitKey(-1);
}


Q1:
img->widthStep 开始的时候,这个 也的是 img->width
测试的时候发现,大部分图片都Ok,但有一个图出现了错位的情况。
观察了下,该图虽然也是 以灰度图 读进来的,但是其 widStep != width


Q2:
读入视频测试的时候,发现还是有好多图片拷贝错位,但是间或又出现一张拷贝正确的。
很是奇怪。。。。
看起来这么简单的代码,哪里会出错呢。。。



图片 拷贝 错位 C
[解决办法]


img->width 和 img->widStep 的区别没有搞懂吧。。。。

width是图像宽度,可为任意值;

widthstep是行字节数,应该是4的倍数,不一定等于width;

所以,并不是说,灰度图读进来的图像就有 width == widStep;
[解决办法]
估计是字节对齐的原因,pSrc = (unsigned char*)src+ i * widStep + r->x;肯定是没问题的,可以把pDes也改成类似的递增方式,试一下。
[解决办法]
行字节数,必须为4的倍数, 不是的话 要 补齐

读书人网 >VC/MFC

热点推荐