#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  这和上面断点执行的结果(红色标注)不一样。 显示的图片和断点执行显示的图片也不一样。崩溃了,断点执行的结果怎么和运行的结果不一样呢???而且我这个是单线程。请指点一下,谢谢!!!

解决方案 »

  1.   

      我是单线程啊  程序就那么多 在上面了    我增加了sum num tem的 输出 可是和断点调试的输出不一样啊  无语了
      

  2.   

    在前面增加一些输出调试信息, printf sum num tem.. 
    看前面image_out 等的数据估计就不一样了
      

  3.   

    要在DEBUG模式下调试,不要在RELEASE模式下单步调试。
      

  4.   

    release下面调试看到的数据有时候不一定是正确的,用输出吧,不要直接看
      

  5.   

    release下面看到的信息本身就是有错误的,没必要的时候不要在release 下面调试,不然就输出到文件中来看
      

  6.   

    在IDE中运行与直接双击EXE文件运行程序的当前路径是不同的,把2.bmp改成绝对路径试试。
      

  7.   

      我就是在DEBUG下运行的啊,Win32 debug  
      

  8.   

    在Debug模式下可用OutputDebugString输出程序里一些变量的值到调试窗口。或者写一个log文件也行
      

  9.   

      我用
                 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  真是见鬼了   什么情况哦
      

  10.   

    void labelset(BYTE *image,int width,int hight, int k,int t,int label)
    {
    *(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; 
    }
    }