Seam Carving for ContentAware Image Resizing Open CV

  • Slides: 21
Download presentation
Seam Carving for Content-Aware Image Resizing 一、效果展示 二、算法原理 三、Open. CV实现 09级计算机 侯世安 2010. 11

Seam Carving for Content-Aware Image Resizing 一、效果展示 二、算法原理 三、Open. CV实现 09级计算机 侯世安 2010. 11

部分代码 梯度函数: void Bright. Gradient(const Ipl. Image *src, Ipl. Image *gra){ for (int h=0;

部分代码 梯度函数: void Bright. Gradient(const Ipl. Image *src, Ipl. Image *gra){ for (int h=0; h<src->height-1; h++) for (int w=0; w<src->width-1; w++) G(h, w)=(abs(B(0, 0)B(0, 1))+abs(B(0, 0)-B(1, 0)))/3; }

算法核心(动规): for(i=1; i<img->width; i++) for(j=0; j<hh; j++) if(P(mask, i, j) == 0){ k =

算法核心(动规): for(i=1; i<img->width; i++) for(j=0; j<hh; j++) if(P(mask, i, j) == 0){ k = pomin( ((j==0)||P(mask, i-1, j-1))? maxint: Ps(sum, i-1, j-1), P(mask, i-1, j)? maxint: Ps(sum, i-1, j), ((j==hh-1)||P(mask, i-1, j+1))? maxint: Ps(sum, i-1, j+1) ); if (k==2) Ps(sum, i, j)=maxint; else{ Pc(seam, i, j)=k; Ps(sum, i, j)=Ps(sum, i-1, j+k)+P(gra, i, j); if (P(mask 2, i, j)) Ps(sum, i, j)-=val. For. Delete; } } else Ps(sum, i, j)=maxint;

注:宏的使用 缩短代码的长度,提高代码可读性 不推荐,建议用内联函数inline //提取 8 U图像a的点 #define P(a, x, y) (((uchar*)((a)->image. Data+(a)>width. Step*(y)))[(x)]) //提取

注:宏的使用 缩短代码的长度,提高代码可读性 不推荐,建议用内联函数inline //提取 8 U图像a的点 #define P(a, x, y) (((uchar*)((a)->image. Data+(a)>width. Step*(y)))[(x)]) //提取 32 S图像a的点 #define Ps(a, x, y) (((int*)((a)->image. Data+(a)>width. Step*(y)))[(x)]) //提取 8 S图像a的点 #define Pc(a, x, y) (((char*)((a)->image. Data+(a)>width. Step*(y)))[(x)]) //提取 8 U 3 C图像a的点 #define Pr(a, x, y, c) (((uchar*)((a)->image. Data+(a)>width. Step*(y)))[(x)*3+(c)])

消息循环的Win 32 API标准形式 int WINAPI Win. Main(…(省略)) { ……(省略)(建立窗口,等等) MSG msg; while (Get. Message(&msg,

消息循环的Win 32 API标准形式 int WINAPI Win. Main(…(省略)) { ……(省略)(建立窗口,等等) MSG msg; while (Get. Message(&msg, NULL, 0, 0)){ Translate. Message(&msg); Dispatch. Message(&msg); } return msg. w. Param; }

鼠标消息处理 void on_mouse( int event, int x, int y, int flags, void* ){ if(

鼠标消息处理 void on_mouse( int event, int x, int y, int flags, void* ){ if( !dis ) return; if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON ) ) prev_pt = cv. Point(-1, -1); //鼠标左键按下则记录当前鼠标坐标 else if( event == CV_EVENT_LBUTTONDOWN ) prev_pt = cv. Point(x, y); else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) ){ //鼠标坐标滑动时不断调用cv. Line函数画直线 Cv. Point pt = cv. Point(x, y); if( prev_pt. x < 0 ) prev_pt = pt; //在图像 mask 和 dis 中画出直线并改变其对应的像素值 cv. Line( mask, prev_pt, cv. Scalar. All(0 xff), 25, 8, 0 ); cv. Line( dis, prev_pt, cv. Scalar. All(0 xff), 25, 8, 0 ); prev_pt = pt; cv. Show. Image( "Working Place", dis ); }