這段時間編程遇到的小坑

  • 迭代器的使用
    遍歷一個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

相關文章
相關標籤/搜索