在进行人脸识别的图像预处理时,分为两个过程,
一、补全图像为正方形或是要求的大小
根据自己的预输入大小等比扩充,先根据输入图像的长宽,判断最长的一边,然后记录与短边的差值
对差值除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),前者是类似于拷贝函数,后者则是类似与引用,个人认为是种错误