迭代器的使用
遍歷一個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
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()
Mat中的圖像數據是不對齊的,而IplImage中的圖像數據是4字節對齊的,因此在訪問IplImage圖像數據的時候,要特別注意widthStep這個屬性,每行的字節數不是width*nchannels而是widthStep,由於每行可能會有字節填充的。it
所以,讀像素值的時候,注意,不要讀錯了。opencv