opencv--学习之感兴趣区域(ROI)
来源:互联网 发布:马扎克加工中心编程 编辑:程序博客网 时间:2024/06/05 16:37
两种获得感兴趣矩形区域的方式
一个是直接用函数 cvSetImageROI(IplImage* image, Cvrect rect), 其中image是加载的一幅图像, rect = cvRect(x, y, width, height) ,x,y给出了矩形在原图像中的起点(从左上起),width,height给出了矩形的宽和高。 书中示例给出了将该矩形区域的蓝色通道增加150 ( 即语句cvAddS(interestimg, cvScalar(add), interestimg))后的图像输出。书中源码如下:
- #include <cv.h>
- #include <highgui.h>
- // ch3_ex3_12 image_name x y width height add#
- int main(int argc, char** argv)
- {
- IplImage* src;
- cvNamedWindow("Example3_12_pre", CV_WINDOW_AUTOSIZE);
- cvNamedWindow("Example3_12_post", CV_WINDOW_AUTOSIZE);
- if( argc == 7 && ((src=cvLoadImage(argv[1],1)) != 0 ))
- {
- int x = atoi(argv[2]);
- int y = atoi(argv[3]);
- int width = atoi(argv[4]);
- int height = atoi(argv[5]);
- int add = atoi(argv[6]);
- cvShowImage( "Example3_12_pre", src);
- cvSetImageROI(src, cvRect(x,y,width,height));
- cvAddS(src, cvScalar(add),src);
- cvResetImageROI(src);
- cvShowImage( "Example3_12_post",src);
- cvWaitKey();
- }
- cvReleaseImage( &src );
- cvDestroyWindow("Example3_12_pre");
- cvDestroyWindow("Example3_12_post");
- return 0;
- }
另一个方法是通过使用widthStep来直接达到与上面相同的效果,这个相当于通过原图的信息来建立一个需要的长宽的矩形IplImage类型,然后再根据期望的感兴趣区域位置,找到矩形的左上角在原图上的坐标,这样就成功划出了感兴趣矩形区域了
与此同时,根据后面的alpha融合的内容,试着将载入了另一幅图像,然后选取了该图像同样大小的一部分,和原图的感兴趣区域按一定的权值融合了,于是使得操作区域出现了“你中有我,我中有你”的现象
- #include <cv.h>
- #include <highgui.h>
- // ch3_ex3_12 image_name x y width height add#
- int main(int argc, char** argv)
- {
- IplImage* src;
- IplImage* src2;
- cvNamedWindow("Example3_12_pre", CV_WINDOW_AUTOSIZE);
- cvNamedWindow("Example3_12_post", CV_WINDOW_AUTOSIZE);
- if (argc == 10 && ((src = cvLoadImage(argv[1], 1)) != 0))
- {
- src2 = cvLoadImage(argv[9]);
- IplImage* interestimg = cvCreateImageHeader(
- cvSize(250, 300),
- src->depth,
- src->nChannels
- );
- IplImage* interestimg2 = cvCreateImageHeader(
- cvSize(250, 300),
- src->depth,
- src->nChannels
- );
- interestimg2->origin = src2->origin;
- interestimg2->widthStep = src2->widthStep;
- interestimg2->imageData = src2->imageData + 12 * src2->widthStep + 12 * src2->nChannels;
- interestimg->origin = src->origin;
- interestimg->widthStep = src->widthStep;
- interestimg->imageData = src->imageData + 120 * src->widthStep + 120 * src->nChannels;
- int add = atoi(argv[6]);
- //double alpha = (double)atof(argv[7]);
- //double beta = (double)atof(argv[8]);
- cvShowImage("Example3_12_pre", src);
- //cvAddS(interestimg, cvScalar(add), interestimg);
- cvAddWeighted(interestimg, alpha, interestimg2, beta, 0.0, interestimg);
- //interestimg->imageData = src->imageData + 120 * src->widthStep + 120 * src->nChannels + 1;
- //cvAddS(interestimg, cvScalar(20), interestimg);
- //interestimg->imageData = src->imageData + 120 * src->widthStep + 120 * src->nChannels + 2;
- //cvAddS(interestimg, cvScalar(30), interestimg);
- cvResetImageROI(src);
- cvShowImage("Example3_12_post", src);
- cvWaitKey();
- }
- cvReleaseImage(&src);
- cvDestroyWindow("Example3_12_pre");
- cvDestroyWindow("Example3_12_post");
- return 0;
- }
书中源程序使用
sub_img->imageData = interest_img->imageData +
interest_rect.y * interest_img->widthStep +
interest_rect.x * interest_img->nChannels;
来找到感兴趣区域的左上角坐标,这样是对蓝色通道数据进行操作,我们可以在后面+1,或+2来对红色或绿色通道来操作,如:interestimg->imageData = src->imageData + 120 * src->widthStep + 120 * src->nChannels + 1;来对红色通道操作
在本程序中,出项了之前没用过的函数“atoi()”,这是一个将字符转换为整形的函数,比如,命令参数中输入的字符串“12”,可以用该函数转换为整形数“12”,同样,atof()将字符转换为浮点型……
- opencv学习之感兴趣区域(ROI)
- opencv--学习之感兴趣区域(ROI)
- OpenCV之感兴趣区域(ROI)
- Opencv感兴趣区域-ROI
- ROI感兴趣区域opencv初级变换学习
- opencv 感兴趣区域建立ROI
- Halcon学习 ROI(感兴趣区域)
- OPENCV图像处理基础(二)感兴趣区域ROI
- openCV任意几何形状感兴趣区域(ROI)提取
- openCV任意几何形状感兴趣区域(ROI)提取
- OpenCV中关于感兴趣的区域ROI
- OpenCV对感兴趣区域(ROI)的操作
- OpenCV对感兴趣区域(ROI)的操作
- OpenCV:设置图像的感兴趣区域(ROI)
- OpenCV中关于感兴趣的区域ROI
- opencv中的ROI(感兴趣区域)的设置
- opencv-视频处理--画感兴趣区域(ROI)
- C/C++ OpenCV设置感兴趣区域ROI
- 安装Linux Mint 17后要做的20件事
- JQuery 取值.赋值的基本方法整理
- iOS尺寸
- IOS 文件管理,基础使用
- 一些黑魔法摘录
- opencv--学习之感兴趣区域(ROI)
- 构造函数不能为虚函数,析构函数可为虚函数
- C# .net设置系统音量
- 安卓学习之路之广播
- maven导出项目依赖的jar包
- 安装ssh登陆其它机器
- UVA10344五个数从前往后进行加减乘运算能否得到23
- 类型强制转换的理解
- 安装windows版node.js