OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
楼主: zcube

opencv排错总结

  [复制链接]
 楼主| 发表于 2012-6-21 21:01:43 | 显示全部楼层

opencv排错总结

我回来了,这个学期课太多,都停了好长时间,不过我会继续把例程解析写完,希望大家支持,呵呵
回复 支持 反对

使用道具 举报

发表于 2012-7-10 10:54:05 | 显示全部楼层

opencv排错总结

不错啊,学习了!
回复 支持 反对

使用道具 举报

发表于 2012-8-4 13:13:26 | 显示全部楼层

opencv排错总结

求助:在执行程序时弹出应用程序错误的窗口: “0x004fbd0f”指令引用的“0x024826c0”内存,该内存不能为“written”是什么情况
程序代码如下
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cvcam.h"
#include "cxcore.h"

int main(int argc, char* argv[])
{
        CvCapture* capture = cvCreateCameraCapture( 0 );
        assert( capture !=NULL );

        //获取一个图像,以用其数据填充IplImage结构
        IplImage* image = cvQueryFrame( capture );
        assert( image != NULL );

        //创建单通道的gray_image
        IplImage* gray_image = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                1
                );
        assert( gray_image != NULL );

        //创建单通道的canny_image
        IplImage* canny_image = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                1
                );
        assert( canny_image != NULL );

        //创建三通道的merge_image
        IplImage* merge_image = cvCreateImage(
                cvSize( image ->width*3, image ->height ),
                image ->depth,
                3
                );
        assert( merge_image != NULL );

        //创建一个三通道的three_channel_gray_image
        IplImage* three_channel_gray_image = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                image ->nChannels
                );
        assert( three_channel_gray_image != NULL );
       
        //创建一个三通道的three_channel_canny_image
        IplImage* three_channel_canny_image = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                image ->nChannels
                );
        assert( three_channel_canny_image != NULL );

        //创建一个sub_image1用来指向merge_image的开始处
        IplImage* sub_image1 = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                image ->nChannels
                );
        sub_image1 -> origin = merge_image -> origin;
        sub_image1 -> widthStep = merge_image -> widthStep;

        //创建一个sub_image2用来指向merge_image的1/3处
        IplImage* sub_image2 = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                image ->nChannels
                );
        sub_image2 -> origin = merge_image -> origin;
        sub_image2 -> widthStep = merge_image -> widthStep;

        //创建一个sub_image3用来指向merge_image的2/3处
        IplImage* sub_image3 = cvCreateImage(
                cvGetSize( image ),
                image ->depth,
                image ->nChannels
                );
        sub_image3 -> origin = merge_image -> origin;
        sub_image3 -> widthStep = merge_image -> widthStep;

        //创建窗口
        cvNamedWindow( "win-in", 0 );
        cvNamedWindow( "win-gray", 0 );
        cvNamedWindow( "win-canny", 0 );
        cvNamedWindow( "win-merge", 0 );

        //创建字体
        CvFont font;
       
        //初始化字体 字体结构体 字体名称标示符 字体高度 字体宽度
        cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 3, 3 );

        while( (image = cvQueryFrame( capture )) != NULL )
        {
                //将image转换成灰度图 输入图像 标目图像 操作标志
                cvConvertImage( image, gray_image, CV_CVTIMG_FLIP );

                //将gray_image做canny处理 输入图像 输出的边缘图像 第一个阈值 第二个阈值
                cvCanny( gray_image, canny_image, 150, 150 );

                //将gray_image转换成三通道
                cvConvertImage( gray_image, three_channel_gray_image );

                //将canny_image转换成三通道
                cvConvertImage( canny_image, three_channel_gray_image );

                //确定三个指针的指向
                sub_image1 ->imageData = merge_image ->imageData;
                sub_image1 ->imageData = merge_image ->imageData + merge_image ->widthStep/3;
                sub_image1 ->imageData = merge_image ->imageData + merge_image ->widthStep/3*2;

                //将要拷贝的图像拷贝到相应的位置
                cvCopyImage( image, sub_image1 );
                cvConvertImage(sub_image1,sub_image1,CV_CVTIMG_FLIP);
                cvCopyImage( three_channel_gray_image, sub_image2 );
                cvCopyImage( three_channel_canny_image, sub_image3 );

                //显示图像
                cvShowImage( "win-in", image );
                cvShowImage( "win-gray", gray_image );
                cvShowImage( "win-canny", canny_image );

                //在相应图像上添加字体
                cvPutText(
                        merge_image,
                        "oringin image",
                        cvPoint( 5, 60 ),
                        &font,
                        CV_RGB( 255, 0, 0 )
                        );
                cvPutText(
                        merge_image,
                        "grayscale image",
                        cvPoint( image ->width, 60 ),
                        &font,
                        CV_RGB( 0, 255, 0 )
                        );
                cvPutText(
                        merge_image,
                        "canny image",
                        cvPoint( image ->width*2+20, 60 ),
                        &font,
                        CV_RGB( 0, 0, 255 )
                        );
                cvShowImage( "win-merge", merge_image );
               
                if( cvWaitKey(30) == 27 )
                        break;

            //释放所有资源
                                                                                                                  
                cvReleaseCapture(&capture);
                cvReleaseImage(&gray_image);
                cvReleaseImage(&canny_image);
                cvReleaseImage(&sub_image1);
                cvReleaseImage(&sub_image2);
                cvReleaseImage(&sub_image3);
                cvDestroyAllWindows();       
        }
        return 0;
}
回复 支持 反对

使用道具 举报

发表于 2012-8-17 11:11:45 | 显示全部楼层

opencv排错总结

本人刚刚学习opencv,现在刚刚有点眉目,但是现在又遇到一道坎,就是遇到这个编译问题(每次都是卡在这些地方),报错error C2065: “BwImage”: 未声明的标识符等等,而opencv2.3.1在vs2010我已经配置好(之前编译的小程序都没问题),本人在网上找了N久都找不到问题,有请知道的人能指教指教,至于源代码如下:
#include <stdio.h>
#include<stdlib.h>
#include &quot;highgui.h&quot;
#include &quot;cv.h&quot;


int main(int argc,char**argv)
{
//声明指针,矩阵
IplImage*image=NULL;
IplImage*backimage=NULL;
IplImage*foreimage=NULL;
IplImage*tank=NULL;
CvMat*imagemat=NULL;
CvMat*foremat=NULL;
CvMat*backmat=NULL;
CvCapture*capture=NULL;
int num=0;
//创建窗口
cvNamedWindow(&quot;cvcamwindow&quot;,CV_WINDOW_AUTOSIZE);
cvNamedWindow(&quot;foreground&quot;,1);
cvNamedWindow(&quot;background&quot;,1);
cvNamedWindow(&quot;wo&quot;,1);
//读取摄像头
       if(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))
              capture=cvCaptureFromCAM(argc==2?argv[1][0]-\'0\':0);
       else if(argc==2)
              capture=cvCaptureFromAVI(argv[1]);
   
//声明视频结构
int isColor = 1;
       int frameW=160;
       int frameH=120;
       int fps=8;
   CvVideoWriter* camWriter=cvCreateVideoWriter(&quot;E:\\\\directx\\\\jianhua12.avi&quot;,-1,fps,cvSize(frameW,frameH),isColor);
       if(!capture)
       {
              fprintf(stderr,&quot;could not initialize capturing...\\n&quot;);
          return 0;
      }
//处理图像
       while(image=cvQueryFrame(capture))
       {
              num++;
              if(num==1)//第一针申请内存
              {
foreimage=cvCreateImage(cvGetSize(image),8,1);
                  backimage=cvCreateImage(cvGetSize(image),8,1);
           tank=cvCreateImage(cvGetSize(image),8,3);
            backmat=cvCreateMat(image->height,image->width,CV_32FC1);
            foremat=cvCreateMat(image->height,image->width,CV_32FC1);
            imagemat=cvCreateMat(image->height,image->width,CV_32FC1);
               //转换成单通道处理
               cvCvtColor(image,backimage,CV_BGR2GRAY);
               cvCvtColor(image,foreimage,CV_BGR2GRAY);
            //矩阵初始化
            cvConvert(foreimage,foremat);
            cvConvert(foreimage,backmat);
            cvConvert(foreimage,imagemat);
          }
              else
              {
                     cvCvtColor(image,foreimage,CV_BGR2GRAY);
                     cvConvert(foreimage,imagemat);
                     
                    //高斯滤波,平滑图像
                     cvSmooth(imagemat,imagemat,CV_GAUSSIAN,3,0,0);
                     //当前跟背景差分
                     cvAbsDiff(imagemat,backmat,foremat);
                     cvConvert(foremat,foreimage);
                    //二值化
                     cvThreshold(foreimage,foreimage,60,255.0,CV_THRESH_BINARY);
                     //进行形态学滤波,去掉噪音
                     cvDilate(foreimage, foreimage, 0, 1);
                    cvErode(foreimage, foreimage, 0, 1);
                     cvErode(foreimage, foreimage, 0, 1);
                     cvDilate(foreimage, foreimage, 0, 1);

                     int nl=foreimage->height;
                     int nc=foreimage->width;
                        BwImage foreimageA(foreimage);
                        RgbImage imageA(image);
                        RgbImage tankA(tank);
                     for(int i=0;i<nl;i++)
                     {
                            for(int j=0;j<nc;j++)
                            {
                                if (foreimageA[j]==0)
                   {
                                      tankA[j].b=0;
                                      tankA[j].g=0;
                                      tankA[j].r=0;
}
                  else      
                                   tankA[j]=imageA[j];                                
                            }
                     }
           tank->origin=image->origin;
//保存前景
                     cvWriteFrame(camWriter,tank);
                     //更新背景
                     cvRunningAvg(imagemat,backmat,0.005,0);
                  //将背景转化为图像格式
                     cvConvert(backmat,backimage);
                     //使图像正立
                     backimage->origin=image->origin;
                     foreimage->origin=image->origin;
                     //显示图像
                     cvShowImage(&quot;cvcamwindow&quot;, image);
           cvShowImage(&quot;background&quot;, backimage);
           cvShowImage(&quot;foreground&quot; ,foreimage);
                     cvShowImage(&quot;wo&quot;,tank);
                  //时间缓冲
           int key=cvWaitKey(90);
                     if(cvWaitKey(2)>=0)
                            break;
              }
       }
       cvDestroyWindow(&quot;cvcam window&quot;);
      cvDestroyWindow(&quot;background&quot;);
      cvDestroyWindow(&quot;foreground&quot;);
      cvDestroyWindow(&quot;wo&quot;);
       cvReleaseImage(&foreimage);
      cvReleaseImage(&backimage);
      cvReleaseImage(&tank);
      
       cvReleaseMat(&imagemat);
      cvReleaseMat(&foremat);
      cvReleaseMat(&backmat);
     cvReleaseVideoWriter (&camWriter);
     
      return 0;
}
回复 支持 反对

使用道具 举报

发表于 2012-8-25 17:39:35 | 显示全部楼层

opencv排错总结

fatal error C1083: 无法打开包括文件:“opencv2/opencv.hpp”: No such file or directory

这个是怎么回事 我明明可以找到opencv2下的opencv.hpp文件的
回复 支持 反对

使用道具 举报

发表于 2012-9-9 19:28:42 | 显示全部楼层

opencv排错总结

1>------ 已启动生成: 项目: op, 配置: Debug Win32 ------
1>生成启动时间为 2012/9/9 19:02:01。
1>InitializeBuildStatus:
1>  正在对“Debug\\op.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  main.cpp
1>e:\\5100822-1\\11\\op\\op\\main.cpp(1): fatal error C1083: 无法打开包括文件:“stdafx.h”: No such file or directory1>
1>生成失败。
1>
1>已用时间 00:00:00.36
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========


刚配置完OpenCV,在VS2010下配置的,然后输入测试程序后显示如上错误提示,问题出在哪里啊?麻烦众位大神帮我看一下
回复 支持 反对

使用道具 举报

发表于 2012-9-21 20:51:14 | 显示全部楼层

opencv排错总结

拜托大家指教一下,这是如何运行的,我用vc直接运行显示的是“please specify video file name” , 是不是要用命令行然后输两个参数啊? 我输了bgfb_segm.exe 123.avi 但是提示不是内部命令 ? 怎么办 谢谢
#include &quot;cvaux.h&quot;
#include &quot;highgui.h&quot;
#include <stdio.h>

//this is a sample for foreground detection functions
int main(int argc, char** argv)
{
IplImage* tmp_frame = NULL;
CvCapture* cap = NULL;

if( argc < 2 )
{
printf(&quot;please specify video file name \\n&quot;);
exit(0);
}

cap = cvCaptureFromFile(argv[1]);
tmp_frame = cvQueryFrame(cap);
if(!tmp_frame)
{
printf(&quot;bad video \\n&quot;);
exit(0);
}

cvNamedWindow(&quot;BG&quot;, 1);
cvNamedWindow(&quot;FG&quot;, 1);

//create BG model
CvBGStatModel* bg_model = cvCreateFGDStatModel( tmp_frame );

for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++ )
{
double t = (double)cvGetTickCount();
cvUpdateBGStatModel( tmp_frame, bg_model );
t = (double)cvGetTickCount() - t;
printf( &quot;%.1f\\n&quot;, t/(cvGetTickFrequency()*1000.) );
cvShowImage(&quot;BG&quot;, bg_model->background);
cvShowImage(&quot;FG&quot;, bg_model->foreground);
char k = cvWaitKey(5);
if( k == 27 ) break;
//printf(&quot;frame# %d \\r&quot;, fr);
}


cvReleaseBGStatModel( &bg_model );
cvReleaseCapture(&cap);

return 0;
}
回复 支持 反对

使用道具 举报

发表于 2012-9-23 18:27:38 | 显示全部楼层

opencv排错总结

各位好,我的环境是VS2010+OenCV2.3.1,没有重新编译,环境变量和包含目录等都已设置,安装方法是按照主页的方法做的,运行以下代码成功。
#include &quot;stdafx.h&quot;

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, _TCHAR* argv[])
{
        const char* imagename = &quot;c:\\\\lena.jpg&quot;;

        //从文件中读入图像
        Mat img = imread(imagename);

        //如果读入图像失败
        if(img.empty())
        {
                fprintf(stderr, &quot;Can not load image %s\\n&quot;, imagename);
                return -1;
        }

        //显示图像
        imshow(&quot;image&quot;, img);

        //此函数等待按键,按键盘任意键就返回
        waitKey();

        return 0;
}

然而,运行包含以下代码段在内的很多程序(包括书上的例子)都会出现错误提示,不知道是为什么。
#include &quot;stdafx.h&quot;


#include &quot;cv.h&quot;
#include &quot;highgui.h&quot;

int g_slider_position = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos)
{
     cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
}

int main(int argc,char** argv)
{
     cvNamedWindow(&quot;Example3&quot;,CV_WINDOW_AUTOSIZE);
     char AviFileName[] = &quot;D:\\\\test.avi&quot;;
     g_capture = cvCreateFileCapture(AviFileName);

     int frames = (int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);

     if(frames!=0)
          cvCreateTrackbar(&quotosition&quot;,&quot;Example3&quot;,&g_slider_position,frames,onTrackbarSlide);

     IplImage* frame;

     while(1)
     {
          frame = cvQueryFrame(g_capture);
          if(!frame) break;
          cvShowImage(&quot;Example3&quot;,frame);
          char c = cvWaitKey(33);
          if(c == 27) break;
     }

     cvReleaseCapture(&g_capture);
     cvDestroyWindow(&quot;Example3&quot;);
}

出错提示如下:
1>d:\\opencv\\build\\include\\opencv2\\flann\\logger.h(66): warning C4996: \'fopen\': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\\program files\\microsoft visual studio 10.0\\vc\\include\\stdio.h(234) : 参见“fopen”的声明
1>d:\\opencv\\build\\include\\opencv2\\flann\\flann.hpp(233): warning C4996: \'cv::flann::Index_<T>\': 被声明为已否决
1> d:\\opencv\\build\\include\\opencv2\\flann\\flann.hpp(278): 参见对正在编译的类 模板 实例化“cv::flann::Index_<T>”的引用
1>ManifestResourceCompile:
1> 所有输出均为最新。
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvSetCaptureProperty
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvNamedWindow
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvCreateFileCapture
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvGetCaptureProperty
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvCreateTrackbar
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvQueryFrame
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvShowImage
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvWaitKey
1>layAVI.obj : error LNK2001: 无法解析的外部符号 _cvReleaseCapture
1>PlayAVI.obj : error LNK2001: 无法解析的外部符号 _cvDestroyWindow
1>C:\\Users\\alexander\\Documents\\Visual Studio 2010\\Projects\\PlayAVI\\Release\\PlayAVI.exe : fatal error LNK1120: 10 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:00.46
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========


请问这应该如何解决?一定要把fopen修改为fopen_s么?直接修改OpenCV的代码会不会出现什么问题?还有就是装了VS2008的各位,这些代码能运行成功么?谢谢了~
回复 支持 反对

使用道具 举报

发表于 2012-10-4 16:36:52 | 显示全部楼层

opencv排错总结

楼上的应该是库没添加好!我复制过来好着啊!建议看看这个:http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=15836&p=54559&hilit=VS2010%E4%B8%AD%E6%96%87%E6%97%97%E8%88%B0%E7%89%88+opencv2.3.1#p54559;好运!
回复 支持 反对

使用道具 举报

发表于 2012-10-6 01:20:35 | 显示全部楼层

opencv排错总结

不错,给力…
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-29 07:59 , Processed in 0.010716 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表