《OpenCV3.0 编程入门》书中3.1.9节图像的载入、显示与输出示例程序练习报异常问题

来源:互联网 发布:gta5捏脸数据女爱丽丝 编辑:程序博客网 时间:2024/05/23 02:05

本文基于自己在练习毛星云的《OpenCV3.0编程入门》这本书时,在VS2013中照着书上的代码敲了一遍,结果编译时出现了“Unhandled exception at 0x7586845D in test_opencv3.0.exe: Microsoft C++ exception: cv::Exception at memory location 0x0029F5F0.”异常。于是和广大入门小白一样,第一时间想到万能的度娘,果然发现遇到这种问题的童鞋还真不少。然而几乎尝试了网上各种解决方案,却依然难以解决。于是博主决定还是靠自己,下面贴上源码以方便说明:

int main(){
Mat image = imread("qie.jpg");//图片大小为1024x768
Mat logo = imread("timg.jpg");//图片大小为650x477


Mat imageROI;
imageROI = image(Rect(800,350,logo.cols,logo.rows)); //注意添加图像的宽度和高度是否超出范围
addWeighted(imageROI,0.5,logo,0.3,0,imageROI);


namedWindow("sh");
imshow("sh",image);
waitKey();

return 0;
}

经过自己几番摸索之后,发现自己忽略了图片大小的细节,代码

imageROI = image(Rect(800,350,logo.cols,logo.rows));

的目的是在image中构造出一个矩形RIO(感兴趣区域),以便在这个区域上叠加图片“logo.jpg"。其中800,350是目标RIO的坐标(原图左上角为坐标原点),logo.cols,logo.rows的值分别为目标RIO区域的width、height。代码中博主用了自己的源图片,而不是作者书中的原图。其中“qie.jpg”大小为1024x768,而“timg.jpg”大小为650x477,当博主设置的坐标原点为800,350,同时logo.cols=650,logo.rows=477。问题就出在这里,此时目标RIO的区域坐标跨度为x方向:【800-->800+477=1277】,y方向坐标坐标跨度为【350-->350+650=1000】,明显超出了原图像("qie.jpg")的范围,导致溢出,产生异常。

解决的方法是,根据logo图片的大小合适设置RIO区域的坐标,避免溢出。例如,在当前图片大小下,设置水平方向_x=374,竖直方向_y=291将是能否产生异常的临界RIO坐标,再往右或者往下都会产生溢出。如当_x=374,_y=292时,出现异常如下图


当_y不变,_x=291时,程序正常显示,此时可以看到目标RIO区域位于原图右下角,但已经达到极限。


0 0