更改图像opencv的宽度步长

更改图像opencv的宽度步长,opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,我正在从事与人脸识别相关的项目。对于我的程序来说,每个图像都应该满足条件img->widthStep=3*img->width 我正在数据库中尝试我的代码,其中每个图像的大小为250x250。但数据库的宽度步长为752,因此上述条件不满足。widthstep的功能是访问像素() 我可以将widthstep参数更改为750而不影响图像的其他参数吗? 或者是否有其他方法来实现条件zimg->widthStep=3*img->widthz 我尝试将250x250复制到260x260图像,如下所示 Ma

我正在从事与人脸识别相关的项目。对于我的程序来说,每个图像都应该满足条件
img->widthStep=3*img->width

我正在数据库中尝试我的代码,其中每个图像的大小为250x250。但数据库的宽度步长为752,因此上述条件不满足。widthstep的功能是访问像素()

我可以将widthstep参数更改为750而不影响图像的其他参数吗?
或者是否有其他方法来实现条件
zimg->widthStep=3*img->widthz

我尝试将250x250复制到260x260图像,如下所示

Mat img1, img2=Mat::zeros(Size(260,260),CV_8UC3);
img1 = imread(ch);
img1.copyTo(img2.colRange(1,250).rowRange(1,250));
但它显示了这个错误:

OpenCV Error: Assertion failed 
    (!fixedSize() || ((Mat*)obj)->size.operator()() =
    = Size(cols, rows)) in unknown function, file D:\opencv2.4.5\opencv\modules\core
    \src\matrix.cpp, line 1372  
有人能帮我吗

谢谢大家!

  • 由于您使用的是术语widthStep,我猜您使用的是IplImage。IplImage取自英特尔性能原件(IPP)库。为了获得良好的性能,要求每行的宽度步长为4的倍数。要强制执行此条件,将使用附加字节填充行。因此,只要使用IplImage,就不能使widthStep等于750,而这不是4的倍数

  • OpenCV 1基于IplImage,但OpenCV 2基于Mat。IplImage被弃用已有一年了

  • Mat没有这样的限制。默认情况下,其步长为750

  • 编辑问题后

    colRange(1250)表示249列,而不是250列。行范围(1250)相同。当要复制的图像的大小不同于目标图像的大小时,将重新分配目标图像。但由于colRange和rowRange返回常量临时映像,因此无法重新分配该映像,程序将崩溃。

    请查看以下内容: