对二值化的前景矩阵进连通分量标记,并返回一个结构数组 这有点不懂,希望有大神解释下

WFH_xiaobai 2016-05-22 04:05:22
//对二值化的前景矩阵进连通分量标记,并返回一个结构数组。该结构包含区域面积、质心坐标及包
//含本区域的矩形的宽高分量
void computeObject(CvMat* foreImageMat, int width, int height, CvMat* labeledMat, movingObject* head)
{
int neighbor[8][2] = { {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1} };
int index = 0,row,col,tRow,tCol;
cvSetZero(labeledMat);
CvPoint *points = new CvPoint[width * height];
int top = 0;
int* pmArr = NULL;
int i,j;
//标记连通分量
for( i = 0; i < height; i ++ )
for( j = 0; j < width; j ++ )
{
if(cvmGet(foreImageMat,i,j) == 255 && cvmGet(labeledMat,i,j) == 0)
{
index ++;
points[top].x = j;
points[top].y = i;
top ++;
while(top > 0)
{
top --;
row = points[top].y;
col = points[top].x;
cvmSet(labeledMat,row,col,index);
for( int m = 0; m < 8; m ++ )
{
tRow = row + neighbor[m][0];
tCol = col + neighbor[m][1];
if(tRow >= 0 && tRow < height && tCol >= 0 && tCol < width)
{

if(cvmGet(foreImageMat, tRow, tCol) == 255 && cvmGet(labeledMat, tRow, tCol) == 0)
{
points[top].x = tCol;
points[top].y = tRow;
top ++;
}
}
}
}
}
}
这是人数检测代码的一部分。。。希望有大神能解释下这段代码的作用,,,,,尤其是红色部分(因为我后面调用摄像头的时候运行到这里出问题了)。。是用来干嘛的???小弟感激不尽!!!!
...全文
1212 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-07-25
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 内存不够用时可以用文件读写模拟内存读写。参考_lseeki64函数。
caguatande095628 2016-07-15
  • 打赏
  • 举报
回复
你们改成赵四老师那样可以吗?#define MAXPOINTS width * height/4 CvPoint *points = new CvPoint[MAXPOINTS];我的改完之后运行四帧就崩溃了
赵4老师 2016-07-04
  • 打赏
  • 举报
回复
引用 7 楼 wangyaninglm 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 caguatande095628 的回复:] 是种子填充法,代码没错,CvPoint *points = new CvPoint[width * height];有问题,老是出现内存不足
应改为 #define MAXPOINTS width * height/4 CvPoint *points = new CvPoint[MAXPOINTS];[/quote] 为啥要除4?[/quote] 仅仅是个比width * height小的应该够用的估值。
shiter 2016-07-03
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 caguatande095628 的回复:] 是种子填充法,代码没错,CvPoint *points = new CvPoint[width * height];有问题,老是出现内存不足
应改为 #define MAXPOINTS width * height/4 CvPoint *points = new CvPoint[MAXPOINTS];[/quote] 为啥要除4?
赵4老师 2016-07-01
  • 打赏
  • 举报
回复
引用 5 楼 caguatande095628 的回复:
是种子填充法,代码没错,CvPoint *points = new CvPoint[width * height];有问题,老是出现内存不足
应改为 #define MAXPOINTS width * height/4 CvPoint *points = new CvPoint[MAXPOINTS];
caguatande095628 2016-06-30
  • 打赏
  • 举报
回复
是种子填充法,代码没错,CvPoint *points = new CvPoint[width * height];有问题,老是出现内存不足
WFH_xiaobai 2016-05-23
  • 打赏
  • 举报
回复
看在我这么晚还在看的份上。。。。。。
WFH_xiaobai 2016-05-23
  • 打赏
  • 举报
回复
有大神没有啊,,求解答啊啊啊啊。。。。。
赵4老师 2016-05-23
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
int xs[10000];
int ys[10000];
int i=0,xx,yy;
int fc,bc;
void push(int x,int y) {
    xs[i]=x;
    ys[i]=y;
    if (i<10000-1) {
        i=i+1;
    } else {
        printf("stack overflow!\n");
        exit(1);
    }
}
void pop(void) {
    i=i-1;
    xx=xs[i];
    yy=ys[i];
}
int check(int x,int y) {
    int c;

    c=getpixel(x,y); /* 获取当前点的颜色 */
    return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */
}
void seedfilling(int x,int y,int fill_color,int boundary_color) {
    fc=fill_color;
    bc=boundary_color;
    push(x,y);
    while (1) {
        if (i<=0) return;
        pop();
        if (check(xx,yy)) {
            putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */

            putpixel(xx, yy, fill_color); /* 画点 */

            if (check(xx-1,yy  )) push(xx-1,yy  );
            if (check(xx  ,yy+1)) push(xx  ,yy+1);
            if (check(xx  ,yy-1)) push(xx  ,yy-1);
            if (check(xx+1,yy  )) push(xx+1,yy  );
            /* 去掉下面四句就是四连通 */
            if (check(xx-1,yy-1)) push(xx-1,yy-1);
            if (check(xx-1,yy+1)) push(xx-1,yy+1);
            if (check(xx+1,yy-1)) push(xx+1,yy-1);
            if (check(xx+1,yy+1)) push(xx+1,yy+1);
        }
    }
}
void main() {
    int a,b,color;
    int gdriver = DETECT, gmode, errorcode;
    int poly[10];

    initgraph(&gdriver, &gmode, "d:\\bc\\bgi");
    a=150;
    b=140;
    color=4;
    poly[0]=110;/* 第一个点的x坐标以及y坐标 */
    poly[1]=110;
    poly[2]=200;/* 第二点 */
    poly[3]=105;
    poly[4]=170;/* 第三点 */
    poly[5]=120;
    poly[6]=150;/* 第四点 */
    poly[7]=170;
    poly[8]=110;/* 多边形的起点与终点一样 */
    poly[9]=110;
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 保证边界对八连通是封闭的 */
    setviewport(0,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,0,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 恢复默认viewport */
    setviewport(0,0,600,300,0);

    seedfilling(a,b,color,15);  /* 种子填充多边形 */

    getch();
    closegraph();
}

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧