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),前者是类似于拷贝函数,后者则是类似与引用,个人认为是种错误

浙公网安备 33010602011771号