【Opencv-Ubuntu】论clone对Mat的重要性
今天在寫(xiě)代碼的時(shí)候遇到這樣一個(gè)問(wèn)題
先來(lái)看個(gè)函數(shù),這是一段更新subShape的函數(shù):
void updateSubShape() {double sub_shape_01_brow_left_data[10] = {mShape.part(17).x(),mShape.part(17).y(),mShape.part(18).x(),mShape.part(18).y(),mShape.part(19).x(),mShape.part(19).y(),mShape.part(20).x(),mShape.part(20).y(),mShape.part(21).x(),mShape.part(21).y()};sub_shape_01_brow_left = cv::Mat(5, 2, CV_64FC1, sub_shape_01_brow_left_data);double sub_shape_02_brow_right_data[10] = {mShape.part(22).x(),mShape.part(22).y(),mShape.part(23).x(),mShape.part(23).y(),mShape.part(24).x(),mShape.part(24).y(),mShape.part(25).x(),mShape.part(25).y(),mShape.part(26).x(),mShape.part(26).y()};sub_shape_02_brow_right = cv::Mat(5, 2, CV_64FC1, sub_shape_02_brow_right_data);double sub_shape_03_eye_left_data[12] = {mShape.part(36).x(),mShape.part(36).y(),mShape.part(37).x(),mShape.part(37).y(),mShape.part(38).x(),mShape.part(38).y(),mShape.part(39).x(),mShape.part(39).y(),mShape.part(40).x(),mShape.part(40).y(),mShape.part(41).x(),mShape.part(41).y()};sub_shape_03_eye_left = cv::Mat(6, 2, CV_64FC1, sub_shape_03_eye_left_data);double sub_shape_04_eye_right_data[12] = {mShape.part(42).x(),mShape.part(42).y(),mShape.part(43).x(),mShape.part(43).y(),mShape.part(44).x(),mShape.part(44).y(),mShape.part(45).x(),mShape.part(45).y(),mShape.part(46).x(),mShape.part(46).y(),mShape.part(47).x(),mShape.part(47).y()};......sub_shape_04_eye_right = cv::Mat(6, 2, CV_64FC1, sub_shape_04_eye_right_data);std::cout << "sub_shape_01_brow_left:" << sub_shape_01_brow_left << std::endl;std::cout << "sub_shape_02_brow_right:" << sub_shape_02_brow_right << std::endl;std::cout << "sub_shape_03_eye_left:" << sub_shape_03_eye_left << std::endl;std::cout << "sub_shape_04_eye_right:" << sub_shape_04_eye_right << std::endl;...... }筆者在當(dāng)前函數(shù)內(nèi)打印出01,02,03,04四個(gè)Mat的信息如下:
sub_shape_01_brow_left:
[77, 83;
?83, 78;
?92, 77;
?100, 79;
?107, 84]
sub_shape_02_brow_right:
[122, 86;
?131, 84;
?141, 85;
?150, 90;
?156, 97]
sub_shape_03_eye_left:
[85, 96;
?90, 95;
?96, 96;
?101, 99;
?95, 100;
?90, 99]
sub_shape_04_eye_right:
[128, 103;
?134, 102;
?139, 103;
?145, 106;
?139, 106;
?133, 106]
?然而神奇的一幕來(lái)啦,當(dāng)筆者在另外一個(gè)函數(shù)中調(diào)用上述函數(shù),打印出01,02,03,04四個(gè)Mat的信息如下:
sub_shape_01_brow_left:
[77, 83;
?83, 78;
?92, 77;
?100, 79;
?107, 84]
sub_shape_02_brow_right:
[122, 86;
?131, 84;
?141, 85;
?150, 90;
?156, 97]
sub_shape_03_eye_left:
[85, 96;
?1.197398590121304e-47, 95;
?6.952696120312864e-310, 6.952696120312864e-310;
?6.444060669718295e-316, 1.427990031124621e-316;
?6.952696120331045e-310, 4.940656458412465e-324;
?3.458459520888726e-323, 6.937713299605351e-310]
sub_shape_04_eye_right:
[128.0001200092957, 6.444533391728236e-316;
?6.444533391728236e-316, 6.444533391728236e-316;
?6.444533391728236e-316, 6.444533638761059e-316;
?6.444533737574188e-316, 6.444533391728236e-316;
?6.444533737574188e-316, 0;
?0, 0]
發(fā)現(xiàn)竟然01,02指向的Mat數(shù)據(jù)正確,03,04指向的數(shù)據(jù)就完全錯(cuò)了,這是神馬情況。然而在cv::Mat(xxx)后添加.clone()后就可以解決上述問(wèn)題。
原來(lái)Mat有淺拷貝和深拷貝的區(qū)分,cv::Mat C(xxx)只是一個(gè)淺拷貝的狀況,淺拷貝后的變量指針都會(huì)與Mat指向同一個(gè)內(nèi)存地址,在上述函數(shù)中筆者使用了大量的cv::Mat(xxx)進(jìn)行淺拷貝,筆者猜測(cè)應(yīng)當(dāng)是opencv在函數(shù)操作中對(duì)Mat的內(nèi)存分配是存在一定限制的,由于筆者使用的cv::Mat(xxx)過(guò)多,已經(jīng)超出了opencv的限制,因此在函數(shù)結(jié)束后,部分內(nèi)存被自動(dòng)釋放,所以導(dǎo)致了上述這個(gè)問(wèn)題。而采用clone的深拷貝的方式,會(huì)完整的為變量字段開(kāi)辟一個(gè)屬于自己的內(nèi)存空間,函數(shù)結(jié)束后,內(nèi)存不能被自動(dòng)釋放,所以不會(huì)出現(xiàn)上述問(wèn)題。
由此可見(jiàn),使用opencv的Mat,一定要深入理解淺拷貝和深拷貝的含義啊,clone也對(duì)于Mat變得無(wú)比重要。
總結(jié)
以上是生活随笔為你收集整理的【Opencv-Ubuntu】论clone对Mat的重要性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 智能家居有什么功能作用
- 下一篇: 如何在国内看netflix