Opencv 小白急求大牛解答

#include
#include
#include
#include
#include
using namespace cv ;
using namespace std ;

struct point
{
int row;
int col ;
} p[1000000];//记录白点的点的集合 即钢

struct vadioline2//2条钢的结构体
{
int id;
int xbegin;
int xend;
int ybegin;
int yend;
int flag;//正确为1,异常为-1;
int cur_max;//最大斜率
int wei_max;//最大宽度
}bmp_line2[100];//7

int main()
{
//IplImage* imgSrc = cvLoadImage("D:\测试钢\2.bmp",0);//对图像的灰度化
IplImage* imgSrc = cvLoadImage("D:\Opencv_picture\1.bmp",0);//对图像的灰度化

/*  cvNamedWindow("show") ;
 cvShowImage("show",imgSrc) ;
 cvWaitKey(0) ;*/
uchar* pixel = new uchar;
//int data =0;
int time = 0 ;
int i,j ;
int len = 0 ;// 白点的个数
//ofstream file("D:\\测试钢\\1.txt", ios::out);//打开一个文件,等同于file.open("test.txt", ios::out);
int ImageData[1000][1000] ;
memset(ImageData,0,sizeof(ImageData)) ;
for (i = 0; i < imgSrc->height; i++)//遍历图像所有像素点
{
    for (j = 0; j < imgSrc->width; j++)
    {
       pixel = (uchar*)(imgSrc->imageData + i*imgSrc->widthStep+j);
        //data = (int)(imgSrc->imageData + i*imgSrc->widthStep+j) ;
       // cout << "pixel=" <<(*pixel)+0<< endl;//+0隐式转换为整型,否则会打印出字符
    /// file <<(*pixel)+0<<" " ;
        ImageData[j][i] = (*pixel)+0 ;
        //ImageData[j][i] = data ;
        /*time++ ;
        if(time == 100)
        { 
            file<<endl ;
        }*/
        if((*pixel)+0 == 255) //把所有的白点都存到了P素组
        //if(data == 255) //把所有的白点都存到了P素组
        {
            p[len].row = j ;
            p[len].col = i;
            len++ ;
        }
    }
}
cout<<len<<endl ;
/*ofstream file1("D:\\测试钢\\11.txt", ios::out); //把点的坐标都记录下来   放到11.TXT的文本文档中
cout<<len<<endl ;
for(i = 0 ; i < len ;i++)
{
    file1 <<p[i].x<<" "<<p[i].y<<" "<<endl ;
        time++ ;
        if(time == 100)
        { 
            file1<<endl ;
        }
}*/
    int change_count = 0 ;
    int change_flag = 0 ;
    int change_first = 0;//是否是第一次发现是2条钢的那条直线
    int change_final = 0 ;//是否是最后一次

    int change_first_y = 0;
    int change_middle_1_y = 0 ;
    int change_middle_2_y = 0 ;
    int change_final_y = 0 ;
    int change_second_y = 0;

    for(i = 0 ; i < 1000 ;i++)
    {
        change_count = 0 ;
        //change_flag = change_count ;
        for(j = 0 ; j < 1000 ;j++)
        {
            if(ImageData[i][j] > 0 && !change_flag)
            {
                change_count++ ;
                change_flag = 1 ;
                if(change_count == 1)
                    change_first_y = j ;
                else
                    change_second_y = j ;

            }
            if(ImageData[i][j] == 0 && change_flag)
            {
                change_flag = 0 ;
                if(change_count == 1)
                {
                    change_middle_1_y = j ;

                }
                else
                    change_middle_2_y = j ;
            }

            if(change_count == 2)
            {
                change_final_y = j ;
                break ;
            }
        }

        if(change_count == 2 ) //说明是第一次发现是2条钢   
        {
            change_flag = 1 ;
            bmp_line2[0].xbegin = i ;//记录下开始坐标
            bmp_line2[0].ybegin = change_first_y ;//记录下开始坐标
            bmp_line2[0].yend = change_middle_1_y-1 ; 

            if(bmp_line2[0].yend - bmp_line2[0].ybegin > bmp_line2[0].wei_max) //算出最大的宽度
                bmp_line2[0].wei_max = bmp_line2[0].yend - bmp_line2[0].ybegin ;

            bmp_line2[1].xbegin = i ;//记录下开始坐标
            bmp_line2[1].ybegin = change_second_y ;//记录下开始坐标
            bmp_line2[1].yend = change_middle_2_y-1 ; 

            if(bmp_line2[1].yend - bmp_line2[1].ybegin > bmp_line2[1].wei_max)
                bmp_line2[1].wei_max = bmp_line2[1].yend - bmp_line2[1].ybegin ;
        }
        if(change_count != 2 && change_first == 1) //说明是最后一次发现是2条钢  
        {
            change_first = 0;
            bmp_line2[0].xend = i ;//记录下结束坐标

            bmp_line2[1].xend = i ;//记录下结束坐标

            break;
        }


    }

ofstream file1("D:\\Opencv_picture\\1.txt", ios::out); //把点的坐标都记录下来   放到11.TXT的文本文档中

file1 <<bmp_line2[0].wei_max<<" "<<bmp_line2[1].wei_max<<" "<<endl ;

cvReleaseImage(&imgSrc);
//delete imgSrc ;
file1.close() ;
//file.close() ;
delete pixel;
delete ImageData ;

return 0 ;

}
//////
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\msvcp140d.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\mfplat.dll”。无法查找或打开 PDB 文件。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\d3d11.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\mfreadwrite.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\concrt140d.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\vcruntime140d.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\ucrtbased.dll”。无法查找或打开 PDB 文件。
“Opencv_judge.exe”(Win32): 已卸载“C:\Windows\System32\ucrtbased.dll”
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\mf.dll”。无法查找或打开 PDB 文件。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\dxgi.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\ucrtbased.dll”。无法查找或打开 PDB 文件。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\cryptbase.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\mfcore.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\crypt32.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\msasn1.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\ksuser.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\bcrypt.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\imm32.dll”。已加载符号。
“Opencv_judge.exe”(Win32): 已加载“C:\Windows\System32\RTWorkQ.dll”。已加载符号。
0x00007FF6DD5D8C27 处的第一机会异常(在 Opencv_judge.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000A7E3A03000)。
0x00007FF6DD5D8C27 处有未经处理的异常(在 Opencv_judge.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000A7E3A03000)。
线程 0xb6c 已退出,返回值为 0 (0x0)。
线程 0x798 已退出,返回值为 0 (0x0)。
线程 0xdc0 已退出,返回值为 0 (0x0)。
程序“[13436] Opencv_judge.exe”已退出,返回值为 0 (0x0)。
图片说明

2个回答

一方面路径要用\来表示,否则无法加载图片,但你这个崩溃主要原因是这个数组:
int ImageData[1000][1000] 过大了,调试状态的栈不够大,需要修改默认的栈大小,vs2013中如下图修改,其他编译器也有类似地方请设置一下:
图片说明

qq_39480894
看不见_风景 谢谢 真的可以 非常感谢你
接近 2 年之前 回复
phenix2009
白色一大坨 双斜杠是一方面,主要问题是栈问题,请修改一下,你代码我已经在自己工程里面跑过了,修改了默认栈大小就可以
接近 2 年之前 回复

应该是图片没有读取成功:

D:\Opencv_picture\1.bmp 两个路径里面\应该用双斜杠,否则是转义字符。

phenix2009
白色一大坨 回复qq_39480894: 主要原因并非双斜杠,你栈用的太多溢出崩溃了,解决方法看我答案
接近 2 年之前 回复
qq_39480894
看不见_风景 可是我用的是双斜杠呢????
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问