看不见_风景 2018-08-09 00:57 采纳率: 33.3%
浏览 1312
已采纳

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条回答 默认 最新

  • 白色一大坨 2018-08-09 01:48
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏