天天看點

opencv異常集錦 之 自定義ROI出現圖像移位

這兩天定義某圖像的ROI時發現,  有時會出現不正常的情況

比如 Rect的位置移位,  偶爾伴有圖像邊框附近出現異常像素

或者幹脆整個都是圖像都變化了

具體什麼原因不太清楚,  可能與記憶體有關, 因為這中間用了好幾個Mat交換資料, 雖然關鍵的地方都用了clone

将定義放到了最前端之後,  這種異常暫時還未出現過

截圖的話以後遇到再截吧,  因為現在已經不出現了

---------------------------

關于自定義ROI , 順便多說兩句怎麼自定義ROI

1. 定義 cv::Rect

cv::Mat regionsOfinterest(src,rect);      
cv::Mat img;      
regionsOfinterest.copyTo(img);      

2. class Range (基本資料類型)

imageROI=image(cv::Range(image.rows-logo.rows,image.rows),

cv::Range(image.cols-logo.cols,image.cols));

3. 和第一個類似,  利用了cv::Mat 普通拷貝 實際上是拷貝了指針且指向的是同一塊記憶體(個人了解)

imageROI= image(cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));

cv::Mat mask(logo);

logo.copyTo(imageROI,mask);

注意:  src.copyTo(dst,mask);  若是src與dst是同一塊記憶體, 就相當于什麼都沒做

自定義不規則形狀的mask時,  不能 src.copyTo(src,mask);

4. void bitwise_and( InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray() )

可以将src1與src2用一個src輸入,  然後根據mask 提取roi

5. Mat& Mat::setTo( InputArray value, InputArray mask=noArray() )  , 置mask區域為指定像素

image.setTo(cv::Scalar s, cv::Mat mask);       

6. inRange()   得到二值化圖像,  常用來提供mask

7.Mat::locateROI

8.Mat::adjustROI

繼續閱讀