这段时间编程遇到的小坑

  • 迭代器的使用
    遍历一个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;    //会修改值
    }

    等同因而一个形参,没有修改数组自己的值。spa

  • opencv的大坑!
    1 cv::Mat img;
    2 img.resize(80,80); //这个函数居然不是resize图像大小,而是相似vector的resize的存在,只改变的img的行数
    3 
    4 resize(img, img, cv::size(80,80)); //这个才能改变图像的大小
  • opencv一个坑接一个坑code

    ①浅拷贝的状况:blog

    //赋值方式为浅拷贝
    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,由于每行可能会有字节填充的。it

    所以,读像素值的时候,注意,不要读错了。opencv

相关文章
相关标签/搜索