• 7387阅读
  • 15回复

请教高手关于QT中使用opencv单高斯建模的问题 [复制链接]

上一主题 下一主题
离线云中海盗
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-19
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-04-22) —
请教一下高手,我这个代码在vs2008环境下可以顺利运行,但是到了Qt4.7环境下却一直错误退出。编译没有问题,但是却总是以错误代码-1073741819退出。不知道有没有高手可以指点我应该怎么改,谢谢啦,目前毕设阶段,很关键啊。。。
  1. #include <highgui.h>
  2. #include <cv.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. int main(int argc, char **argv)
  7. {
  8.     //新建窗口
  9.     cvNamedWindow("origin", CV_WINDOW_AUTOSIZE);
  10.     cvNamedWindow("processing", CV_WINDOW_AUTOSIZE);
  11.     double alpha = 0.05;    //背景建模alpha值
  12.     double std_init = 20;    //初始标准差
  13.     double var_init = std_init * std_init;    //初始方差    
  14.     double lamda = 2.5 * 1.2;    //背景更新参数
  15.     //视频文件
  16.     CvCapture *capture = NULL;
  17.     //读取视频文件
  18.     if (argc == 1)
  19.     {
  20.         //从摄像头读入
  21.         capture = cvCreateCameraCapture(0);
  22.     }
  23.     else if (argc == 2)
  24.     {
  25.         //从文件读入
  26.         capture = cvCreateFileCapture(argv[1]);
  27.     }
  28.     else
  29.     {
  30.         //读入错误
  31.         printf("input error\n");
  32.         return -1;
  33.     }
  34.     IplImage *frame = NULL;        //原始图像
  35.     IplImage *frame_u = NULL;    //期望图像
  36.     IplImage *frame_var = NULL;    //方差图像
  37.     IplImage *frame_std = NULL;    //标准差
  38.     CvScalar pixel = {0};        //像素原始值
  39.     CvScalar pixel_u = {0};        //像素期望
  40.     CvScalar pixel_var = {0};    //像素方差
  41.     CvScalar pixel_std = {0};    //像素标准差
  42.     //初始化frame_u, frame_var, frame_std
  43.     frame = cvQueryFrame(capture);
  44.     frame_u = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
  45.     frame_var = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
  46.     frame_std = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
  47.     for (int y = 0; y < frame->height; ++y)
  48.     {
  49.         for (int x = 0; x < frame->width; ++x)
  50.         {
  51.             pixel = cvGet2D(frame, y, x);
  52.             pixel_u.val[0] = pixel.val[0];
  53.             pixel_u.val[1] = pixel.val[1];
  54.             pixel_u.val[2] = pixel.val[2];
  55.             pixel_std.val[0] = std_init;
  56.             pixel_std.val[1] = std_init;
  57.             pixel_std.val[2] = std_init;
  58.             pixel_var.val[0] = var_init;
  59.             pixel_var.val[1] = var_init;
  60.             pixel_var.val[2] = var_init;
  61.             cvSet2D(frame_u, y, x, pixel_u);
  62.             cvSet2D(frame_var, y, x, pixel_var);
  63.             cvSet2D(frame_std, y, x, pixel_std);
  64.         }
  65.     }
  66.     while (cvWaitKey(33) != 27)        //按ESC键退出, 帧率33ms
  67.     {
  68.         frame = cvQueryFrame(capture);
  69.         //视频结束退出
  70.         if (!frame)
  71.         {
  72.             break;
  73.         }
  74.         //单高斯背景更新
  75.         for (int y = 0; y < frame->height; ++y)
  76.         {
  77.             for (int x = 0; x < frame->width; ++x)
  78.             {
  79.                 pixel = cvGet2D(frame, y, x);
  80.                 pixel_u = cvGet2D(frame_u, y, x);
  81.                 pixel_std = cvGet2D(frame_std, y, x);
  82.                 pixel_var = cvGet2D(frame_var, y, x);
  83.                 //|I-u| < lamda*std 时认为是背景, 进行更新
  84.                 if (fabs(pixel.val[0] - pixel_u.val[0]) < lamda * pixel_std.val[0] &&
  85.                     fabs(pixel.val[1] - pixel_u.val[1]) < lamda * pixel_std.val[1] &&
  86.                     fabs(pixel.val[2] - pixel_u.val[2]) < lamda * pixel_std.val[2])
  87.                 {
  88.                     //更新期望 u = (1-alpha)*u + alpha*I
  89.                     pixel_u.val[0] = (1 - alpha) * pixel_u.val[0] + alpha * pixel.val[0];
  90.                     pixel_u.val[1] = (1 - alpha) * pixel_u.val[1] + alpha * pixel.val[1];
  91.                     pixel_u.val[2] = (1 - alpha) * pixel_u.val[2] + alpha * pixel.val[2];
  92.                     //更新方差 var = (1-alpha)*var + alpha*(I-u)^2
  93.                     pixel_var.val[0] = (1 - alpha) * pixel_var.val[0] +
  94.                                     (pixel.val[0] - pixel_u.val[0]) * (pixel.val[0] - pixel_u.val[0]);
  95.                     pixel_var.val[1] = (1 - alpha) * pixel_var.val[1] +
  96.                                     (pixel.val[1] - pixel_u.val[1]) * (pixel.val[1] - pixel_u.val[1]);
  97.                     pixel_var.val[2] = (1 - alpha) * pixel_var.val[2] +
  98.                                     (pixel.val[2] - pixel_u.val[2]) * (pixel.val[2] - pixel_u.val[2]);
  99.                     //更新标准差
  100.                     pixel_std.val[0] = sqrt(pixel_var.val[0]);
  101.                     pixel_std.val[1] = sqrt(pixel_var.val[1]);
  102.                     pixel_std.val[2] = sqrt(pixel_var.val[2]);
  103.                     //写入矩阵
  104.                     cvSet2D(frame_u, y, x, pixel_u);
  105.                     cvSet2D(frame_var, y, x, pixel_var);
  106.                     cvSet2D(frame_std, y, x, pixel_std);
  107.                 }
  108.             }
  109.         }
  110.         //显示结果
  111.         cvShowImage("origin", frame);
  112.         cvShowImage("processing", frame_u);
  113.     }
  114.     //释放内存
  115.     cvReleaseCapture(&capture);
  116.     cvReleaseImage(&frame);
  117.     cvReleaseImage(&frame_u);
  118.     cvReleaseImage(&frame_var);
  119.     cvReleaseImage(&frame_std);
  120.     cvDestroyWindow("origin");
  121.     cvDestroyWindow("processing");
  122.     return 0;
  123. }
离线云中海盗
只看该作者 1楼 发表于: 2011-04-19
自己顶一个。。。
离线浪漫天使
只看该作者 2楼 发表于: 2011-04-19
frame = cvQueryFrame(capture);
返回的frame是NULL的

是不是要在命令行运行 并加上什么参数的?

[ 此帖被浪漫天使在2011-04-19 16:31重新编辑 ]
离线云中海盗
只看该作者 3楼 发表于: 2011-04-19
回 2楼(浪漫天使) 的帖子
可是之前不是从视频或者摄像头中读取了么?应该是在队列里面了呀?
//读取视频文件
    if (argc == 1)
    {
        //从摄像头读入
        capture = cvCreateCameraCapture(0);
    }
    else if (argc == 2)
    {
        //从文件读入
        capture = cvCreateFileCapture(argv[1]);
    }
    else
    {
        //读入错误
        printf("input error\n");
        return -1;
    }
离线浪漫天使
只看该作者 4楼 发表于: 2011-04-19
argc 和argv的含义 是表示运行程序时传进来的参数个数与对应的内容吧
你直接点 qtcreator 里面的运行 没有给程序任何参数啊。

不是很清楚你说的队列是什么意思 而且别的的机器可能没有摄像头
建议你先弄清楚 argc 和argv的意思
[ 此帖被浪漫天使在2011-04-19 17:28重新编辑 ]
离线duduqq

只看该作者 5楼 发表于: 2011-04-20
这两天我也用了OPENCV2.2,程序也一直运行不起来,
后来安装了OPENCV1.0的,程序就能跑了
如果你觉得你的代码没问题,你也可以试试安装OPENCV1.0,看看行不行.
离线云中海盗
只看该作者 6楼 发表于: 2011-04-21
回 4楼(浪漫天使) 的帖子
这两个参数应该没有问题的,我是直接点运行的。而且我用混合高斯建模的代码运行没有问题,应该是代码的问题,我直接读取的视频文件都在相应目录下的,应该没有问题,估计是代码里面有问题,他的流程就是从文件里面读取图像放到队列里面,然后对图像进行单高斯建模处理。
离线云中海盗
只看该作者 7楼 发表于: 2011-04-21
回 5楼(duduqq) 的帖子
那个太老了吧,我貌似用2.0都不行啊。。。
离线duduqq

只看该作者 8楼 发表于: 2011-04-21
回 7楼(云中海盗) 的帖子
不会老,1.0我都可以用
我是在WINDOWS 7下用的,直接下个exe的安装包.
2.2的在WINDOWS 7下就不能用
离线云中海盗
只看该作者 9楼 发表于: 2011-04-21
回 8楼(duduqq) 的帖子
我是叉P,就是直接安装的,我编译也用过,还是安装方便,所以我这样弄了,现在的问题是我用vs2008直接运行是可以的,但是通过QT4.7进行运行却出了问题,所以才请教呀。。。
离线云中海盗
只看该作者 10楼 发表于: 2011-04-21
继续顶啊。。。希望高手可以看到。。。、
离线云中海盗
只看该作者 11楼 发表于: 2011-04-21
回 5楼(duduqq) 的帖子
刚才我用了2.0的库试过了,还是不行,看来比较麻烦,不知道是什么问题,基本确定是在初始化的时候出的问题,本来以为你cvqueryframe提取的时候因为不能修改造成空指针,但是我后来修改了还是不行,看来还有问题啊。。。
离线云中海盗
只看该作者 12楼 发表于: 2011-04-22
希望今天有解决方案,拜托了。。。昨天好像尝试过在循环里面建立新的类,但是好像还没成功,不过出问题的地方换了。。。很奇怪为什么vs2008里面是可以的呀~~~
离线云中海盗
只看该作者 13楼 发表于: 2011-04-25
再顶个。。。
离线duduqq

只看该作者 14楼 发表于: 2011-04-25
估计你是少了库,你要把OPENCV在BIN那里的DLL库复制到生成的exe目录下
或者你直接又击exe文件,会提示你少了什么库的,会有很多库要复制
离线云中海盗
只看该作者 15楼 发表于: 2011-04-29
回 14楼(duduqq) 的帖子
如果缺少库的话会直接提示缺少某个库,我复制过来就行了,但是有点问题就是,程序是可以运行的,只是会在运行过程中告诉我有地址错误。。。所以很郁闷。。。求高手指点。。。
快速回复
限100 字节
 
上一个 下一个