opencv - 更改图像opencv的宽度步长

我正在从事与人脸识别相关的项目。为了使我的程序正常工作,每个图像应满足img->widthStep = 3 * img->width条件。

我正在尝试在数据库中的每个图像大小为250x250的代码。但是数据库的宽度步长为752,因此上述条件不满足。 widthstep的功能是访问像素(http://opencv-users.1802565.n2.nabble.com/What-is-widthstep-td2679559.html)。

我可以在不影响图像其他参数的情况下将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取自Intel Performance Primitives(IPP)库。为了获得良好的性能,要求每行的widthStep应该是4的倍数。为了强制执行此条件,必须用附加字节来填充行。因此,只要您使用IplImage,您将无法使widthStep等于750,而不是4的倍数。
  • OpenCV 1基于IplImage,而OpenCV 2基于Mat。自IplImage被弃用已经过去了一年。
  • Mat没有这种限制。默认情况下,其步骤为750。

  • 编辑问题后:

    colRange(1,250)表示249列,而不是250列。rowRange(1,250)相同。当要复制的图像尺寸与目标图像尺寸不同时,将重新分配目标图像。但是由于colRange和rowRange返回恒定的临时镜像,因此无法重新分配它,并且程序崩溃。

    https://stackoverflow.com/questions/23858908/

    相关文章:

    android - 如何使用静态OpenCV在Android中使用JavaCV的静态方法

    opencv - 如何从opencv中的上下文获取设备列表

    docker - 无法在 Dockerfile 中运行 sysctl 命令

    macos - 带有OpenCV Mac的CMake(小牛)

    python - 使用 slider 编辑颜色值

    docker - depends_on不等待docker-compose 1.22.0中的其他服务

    android - 使用JNI获取arrayList的元素

    python - 使用OpenCV计数视频中的帧…(Python)

    opencv - ANN-人工神经网络训练

    python - 质心计算程序中的时间滞后