-
迭代器的使用
遍历一个vector<自定义的结构体> v,结构体里面部分是计算的输入,部分是输出。于是我图简单直接写了:for(auto iter : v) v.a = Algorthim(v.b);
后来就直接用v进行后来的计算了,发现出错。原来auto iter是不会改变v数组本身的值的!
因为这种写法展开就是:for(auto iter : v) { } 等同于: for(auto piter = v.begin(); piter != v.end(); piter++) { auto iter = *piter; iter.a = XXX; //不会修改值 *piter->a = XXX; //会修改值 }
等同于是一个形参,没有修改数组本身的值。
- opencv的大坑!
1 cv::Mat img; 2 img.resize(80,80); //这个函数竟然不是resize图像大小,而是类似vector的resize的存在,只改变的img的行数 3 4 resize(img, img, cv::size(80,80)); //这个才能改变图像的大小
-
opencv一个坑接一个坑
①浅拷贝的情况:
//赋值方式为浅拷贝 cv::Mat img1, img2; img1=imread("test.jpg"); //将任意一张名为test.jpg的图片放置于工程文件夹test中 img2 = img1; //浅拷贝,修改img2的时候,同时修改img1 //传参时1: void Func1(cv::Mat img1) { cv::Mat img2 = img2; //浅拷贝 } //传参时2: void Func1(unsigned char* data, int width, int height) { cv::Mat img2(height, width, CV_8UC3, data); //浅拷贝 }
②深拷贝的情况:
img2.copyTo(img1) img1=img2.clone()
- opencv另外一个坑:
Mat中的图像数据是不对齐的,而IplImage中的图像数据是4字节对齐的,所以在访问IplImage图像数据的时候,要特别注意widthStep这个属性,每行的字节数不是width*nchannels而是widthStep,因为每行可能会有字节填充的。
因此,读像素值的时候,注意,不要读错了。