OpenCV.js 中旋转时图像自动裁剪

nph*_*anh 5 opencv image-processing ionic-framework

我使用 OpenCV.js 将图像左右旋转,但旋转时图像被裁剪。这是我的代码:

    let src = cv.imread('img');
    let dst = new cv.Mat();
    let dsize = new cv.Size(src.rows, src.cols);
    let center = new cv.Point(src.cols/2, src.rows/2);
    let M = cv.getRotationMatrix2D(center, 90, 1);
    cv.warpAffine(src, dst, M, dsize, cv.INTER_LINEAR, cv.BORDER_CONSTANT, new cv.Scalar());
    cv.imshow('canvasOutput', dst);
    src.delete(); dst.delete(); M.delete();
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

这是我的源图像:来源

这就是我要的:图像

但它返回的是这样的:裁剪过的

我应该怎么做才能解决这个问题?

P/s:除了javascript之外,我不知道如何使用不同的语言。

Fer*_*cia 1

有点晚了,但考虑到 opencv.js 材料的稀缺,我将发布答案:

函数 cv.warpAffine 会裁剪图像,因为它只执行 OpenCV 和其他来源中记录的数学转换,如果您希望旋转到任何角度,则需要计算填充以进行补偿。

如果您只想旋转 90 度的倍数,您可以使用 cv.rotate,如下所示:

cv.rotate(src, dst, cv.ROTATE_90_CLOCKWISE);
Run Code Online (Sandbox Code Playgroud)

其中 src 是源图像的矩阵,dst 是目标矩阵,可以定义为空,如下所示,let dst = new cv.Mat();并且cv.ROTATE_90_CLOCKWISE是指示旋转角度的旋转标志,有三种不同的选项:

cv.ROTATE_90_CLOCKWISE
cv.ROTATE_180
cv.ROTATE_90_COUNTERCLOCKWISE
Run Code Online (Sandbox Code Playgroud)

您可以在存储库的 opencv_js.congif.py文件中找到在 OpenCV.js 上实现了哪些 OpenCV 函数,如果该函数被指示为白名单,则即使该函数未包含在 opencv.js 教程中,也可以在 opencv.js 上运行。

有关如何使用每个函数的信息可以在一般文档中找到,参数的顺序通常在 C++ 指示上指示(不要被 oscure C++ 向量类型 sintax 分散注意力)和标志的名称(像旋转标志)通常在 python 指示上指示。