作者:翟天保Steven
著作權宣告:著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處
問題說明
近期在用vector存放Mat資料時發現個很有意思的現象,大概意思是我初始化了一個vector-V,初始內容為10個全1矩陣,然后給V[0]=5*src,src是一個Mat型別的矩陣,此時發現V[1]和[2]也變成了5*src的內容,有興趣的可以自己試試,
我個人猜測是因為5*src得到的是一個矩陣算式MatExpr型別,該型別放置在vector中可能會因某些原因使vector內的資料產生同變,后來我用了一個Mat作中間變數,該問題就修復了,
問題復現
1)定義一個任意Mat型別的矩陣src,資料隨意,
cv::Mat src = cv::Mat::zeros(10, 10, CV_32FC1);
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 10; ++j)
{
src.at<float>(i, j) = rand() % 255;
}
}
2)定義一個vector容器,初始化存放3個全零矩陣,
vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));
3)如圖所示,V中的3個Mat全是全零矩陣,

4)令V的第一個Mat等于5*src,
V[0] = 5 * src;
5)如圖所示,V中的3個Mat全是全變成了5*src,然而此時我還沒對后面兩個Mat操作,若繼續V[1]=6*src,3個Mat就全變成了6*src,
6)若參考一個Mat作為中間變數,
cv::Mat s = 5 * src;
V[0]=s;
7)此時就只有V[0]變了,注意一般不建議直接=賦值,而是s.clone(),避免對源資料產生影響, 
解決方案
綜上所述,如果你想用vector存放一些Mat,要么采用push_back的方式(該方法放入容器的其實也是Mat),要么就用Mat作中間變數進行矩陣算式,再賦給容器某個位置的Mat,
vector<cv::Mat> V(3, cv::Mat::zeros(src.size(), src.type()));
cv::Mat s = 5 * src;
V[0] = s;
如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302168.html
標籤:AI
上一篇:人工智能術語集
