image - C#EmguCV调整Mat大小但保持边界/分辨率

标签 image opencv resize emgucv

我尝试了很多事情,但是所有尝试都失败了。
我需要将灰度图像(2560x1440)调整为更低或更高的分辨率,然后我需要将边界设置为原始大小(2560x1440),但将调整后的图像保持在中心。
我使用的是EmguCV 4.3和Mat,我尝试了许多方法,并在Mat构造函数和copyTo上使用了ROI,但没有任何效果,它总是使用调整大小的边界设置新Mat
要求的示例:
源图像:(2560x1440)
source
调整了50%的大小,但与源保持相同的边界(2560x1440)
x0.5
调整大小为300%,但与来源保持相同的边界(2560x1440)
300

最佳答案

使用WarpAffine对图像应用仿射变换。使用转换矩阵,您可以应用比例并转换转换。还支持旋转,但在我的示例中未涉及。转换值也可以为负。
WrapAffine方法还有更多参数可供您使用。

    public void Test()
    {
    
        var img = new Mat("Bmv60.png", ImreadModes.Grayscale);
    
        Mat upscaled = GetContentScaled(img, 2.0, 0.5, 0, 0);
        upscaled.Save("scaled1.png");
    
        Mat downscaled = GetContentScaled(img, 0.5, 0.5, 0, 0);
        downscaled.Save("scaled2.png");
    }
    
    private Mat GetContentScaled(Mat src, double xScale, double yScale, double xTrans, double yTrans, Inter interpolation = Inter.Linear)
    {
        var dst = new Mat(src.Size, src.Depth, src.NumberOfChannels);
        var translateTransform = new Matrix<double>(2, 3)
        {
            [0, 0] = xScale, // xScale
            [1, 1] = yScale, // yScale
            [0, 2] = xTrans + (src.Width - src.Width * xScale) / 2.0, //x translation + compensation of  x scaling
            [1, 2] = yTrans + (src.Height - src.Height * yScale) / 2.0 // y translation + compensation of y scaling
        };
        CvInvoke.WarpAffine(src, dst, translateTransform, dst.Size, interpolation);
    
        return dst;
    }

关于image - C#EmguCV调整Mat大小但保持边界/分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62524257/

相关文章:

javascript - 使用 ng2-img-max 调整图像大小时出错

css - 停止在移动设备中调整文本大小

javascript - 在放置的元素中启用调整大小-Javascript

java - OpenCV 错误 : Null array pointer Java

visual-c++ - "cl.exe"(来自 VisualStudio 的命令行编译器)和头文件的困难!

javascript - 一页上多个图像的模态

android - 如何向 Canvas/paintText 添加自动换行符

c++ - 在 OpenCV C++ 中查找 Mat() 的所有峰值

ios - Swift- 将图像宽度设置为等于外部图像的宽度

javascript - 有没有办法从生成的条形码创建图像或矢量文件?