opencv的mat进行图像边界填充问题

在进行人脸识别的图像预处理时,分为两个过程,

一、补全图像为正方形或是要求的大小

根据自己的预输入大小等比扩充,先根据输入图像的长宽,判断最长的一边,然后记录与短边的差值

对差值除2的到要扩充的长度

 

 

 opencv会以原图为基准,逐行处理,先扩展左边界,复制原图数据到目的图像,再扩展右边界。

cv::copyMakeBorder(src, dst, extRows, extRows, extCols, extCols, BORDER_REPLICATE);//填充边界函数

  

二、图像等比缩小

使用函数resize,根据自己的预输入大小等比缩小

cv::resize(src, dst,Size(112,112));

  

使用注意

在对mat对象进行赋值时,注意赋值的是引用还是新的变量

image(rect).copyTo(faceimage);
faceimage=image(rect)
的区别就是如此
    const char* imagepath = "0.jpg";
    cv::Mat m = cv::imread(imagepath, 1);
    cv::Mat faceimage;
    cv::Rect rect(10,10,10,10);
    m(rect).copyTo(faceimage);
    cv::Mat faceimage2=m(rect);

    cv::Mat dst ;
    cv::Mat dst2 ;

    cv::copyMakeBorder(faceimage, dst, 10, 10, 10, 10, cv::BORDER_CONSTANT);//填充边界函数
    cv::copyMakeBorder(faceimage2, dst2, 10, 10, 10, 10, cv::BORDER_CONSTANT);//填充边界函数

    cout << dst;
    cout << "okkkkkkkkkkkkkkkkkkkkkkkkkk";

    cout << dst2;

  输出:1

 

2:

 

 

 可以看出 image(rect).copyTo(faceimage);和faceimage=image(rect),前者是类似于拷贝函数,后者则是类似与引用,个人认为是种错误

posted @ 2022-05-10 22:34  durtime  阅读(485)  评论(0)    收藏  举报