opencv的mat进行图像边界填充问题
在进行人脸识别的图像预处理时,分为两个过程,
一、补全图像为正方形或是要求的大小
根据自己的预输入大小等比扩充,先根据输入图像的长宽,判断最长的一边,然后记录与短边的差值
对差值除2的到要扩充的长度
opencv会以原图为基准,逐行处理,先扩展左边界,复制原图数据到目的图像,再扩展右边界。
1 | cv::copyMakeBorder(src, dst, extRows, extRows, extCols, extCols, BORDER_REPLICATE); //填充边界函数 |
二、图像等比缩小
使用函数resize,根据自己的预输入大小等比缩小
1 | cv::resize(src, dst,Size(112,112)); |
使用注意
在对mat对象进行赋值时,注意赋值的是引用还是新的变量
image(rect).copyTo(faceimage);
faceimage=image(rect)
的区别就是如此
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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),前者是类似于拷贝函数,后者则是类似与引用,个人认为是种错误
本文作者:durtime
本文链接:https://www.cnblogs.com/durtime/p/16255753.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-05-10 团队开发day09