天天看点

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

继续阅读