#include "cxcore.h"
#include "highgui.h"
#include "cv.h"
#include <stdio.h>IplImage* img=NULL;
IplImage* img_out=NULL;
void labelset(BYTE *image,int width,int hight, int k,int t,int label); //此函数功能为连通区域标注 即把遇到第一个连通的黑色区域像素都改成1,第二个都改成2,依次类推程序太长就不列出
typedef struct{
int x;
int y;
}Point;void biaoji(BYTE *image_in,BYTE *image_out,int width,int height,int cn)
{ int sum=0,num=0,tem=0;
int i,j;
for( i=0;i<height;i++)
for( j=0;j<width;j++)
{
*(image_out+i*width+j)=*(image_in+i*width+j);
}
for( i=0;i<height;i++)
for( j=0;j<width;j++)
{
if (*(image_out+i*width+j)==0)
{
labelset(image_out,width,height,i,j,label); //label是标记点的像素值
label++; //像素加一 准备为下一个连通区域标注 }
}
for(i=0;i<height;i++) //统计图像指定像素的个数
for(j=0;j<width;j++)
{
if (*(image_out+i*width+j)==1)
{
sum++;
}
if (*(image_out+i*width+j)==2)
{
num++;
}
if (*(image_out+i*width+j)==3)
{
tem++;
}
} cvShowImage("OpenCV",img_out);
printf("sum=%d, num=%d,tem=%d", sum, num,tem); //断点执行程序运行到此处时 sum=391 num=750 tem=0 这和预想的情况一样,因为本图像只有2个连通区域,被标为1 2
cvWaitKey(0);
}void main()
{
int width,heght;
cvNamedWindow("OpenCV",CV_WINDOW_AUTOSIZE); //创建窗口
img=cvLoadImage("2.bmp",0); //载入图片
cvThreshold(img,img,100,255,CV_THRESH_BINARY); //二值化
img_out=cvCreateImage(cvGetSize(img),8,1);
width=img->width;
heght=img->height;
biaoji((BYTE*)img->imageData,(BYTE*)img_out->imageData,width,heght,100);} 在32位控制台长,结合OpenCV写了一个程序 想把制定的图片二值化后连通区域标注,断点执行的结果完全正确,可是一执行就有问题,运行后 sum=948 num=391 tem=750 这和上面断点执行的结果(红色标注)不一样。 显示的图片和断点执行显示的图片也不一样。崩溃了,断点执行的结果怎么和运行的结果不一样呢???而且我这个是单线程。请指点一下,谢谢!!!
解决方案 »
- OnCreate成功,Create失败
- 对一个窗口发消息,怎样找到该窗口的句柄,问题解决一定加满
- 新手请教:2个mfc程序间消息发送和接受的例子代码。我的邮箱:[email protected]
- 关于MFC时间控件的请教
- 有哪位大虾能帮帮我解决下这个问题呀,不甚感激~~~:使用COM+产生的RPC服务器不可用(刚一开始好用,但用时间长了会出现)
- 请问如何获得一个文件的字符数(如:获得一个文本文件的字数)
- 强答题:请听好题"请问如何在可编辑的列表框中显示你想输入的字符串,而且可以输入多行?",开始!
- 高分求netforensics.com的资料?有关国内的信息。
- wcout哪来的?
- 有分不拿白不拿,对不对?
- 关于参数lParam
- 怎样写关于 类似棋盘类游戏的算法??
看前面image_out 等的数据估计就不一样了
for(j=0;j<height;j++)
for(i=0;i<width;i++)
{
printf("%d\t",*(image_out+j*width+i)); }把image_out数组全部输出 发现只有值为 1 和 255 的像素 可是统计 像素值为 101 201 的num tem值 却显示为391 750 真是见鬼了 什么情况哦
{
*(image+k*width+t)=label;
int i,j,cn;
int im,ip,jm,jp;
for(;;)
{
cn=0;
for(i=0;i<hight;i++)
for(j=0;j<width;j++)
{
if (*(image+i*width+j)==label)
{
im=i-1;ip=i+1;jm=j-1;jp=j+1;
if (im<0) im=0;
if (ip>hight) ip=hight-1;
if (jm<0) jm=0;
if (jp>width) jp=width-1;
if (*(image+im*width+jm)==0)
{
*(image+im*width+jm)=label; }
if (*(image+im*width+jp)==0)
{
*(image+im*width+jp)=label;
}
if (*(image+ip*width+jm)==0)
{
*(image+ip*width+jm)=label;
}
if (*(image+ip*width+jp)==0)
{
*(image+ip*width+jp)=label;
}
if (*(image+i*width+jm)==0)
{
*(image+i*width+jm)=label;
}
if (*(image+i*width+jp)==0)
{
*(image+i*width+jp)=label;
}
if (*(image+im*width+j)==0)
{
*(image+im*width+j)=label;
}
if (*(image+ip*width+j)==0)
{
*(image+ip*width+j)=label;
} }
}
if (cn ==0) break;
}
}