VC++6.0与OpenCV1.0环境经常出现的错误及解决办法

1. OpenCV2.2也添加了相关路径。。。。。。(P267<<Visual C++数字图象处理开发入门与编程实践>>)未通过编译,程序运行时报错fatal error C1083: Cannot open include file: 'cv.h': No such file or directory。

解决办法:由于编程软件使用的是VC6.0,建议用OpenCV1.0。


2. 安装OpenCV1.0,进行相关的全局设置。不要忘了添加<OpenCV安装目录>\lib,否则连接时报错“LINK : fatal error LNK1181: cannot open input file "..\..\Program Files\OpenCV\lib\highgui.lib" 执行 link.exe 时出错.”


3. 问题描述:编译没问题,但运行时出现如下警告对话框。Could not execute: invalid directory (Win32 error 267)  

解决办法:造成这个错误的原因主要是运行别人的程序时,设置不正确.,工程—>设置,问题出在右边“调试”标签的“工作目录”和你现在运行工程的目录不一致。把工作目录中的路径去掉即可。


 

4. pCapture = cvCaptureFromFile(szVideoFileName);不能打开AVI视频文件,

解决办法:网上下载一个“K-Lite Codec Pack Full 3.9.3 Beta”(常用视频播放插件合集),安装以后,程序能顺利打开视频文件。


5. 新建工程后,程序编译时报错

Linking...

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvReleaseImage

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvDestroyWindow

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvWaitKey

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvShowImage

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvNamedWindow

LoadImage01Dlg.obj : error LNK2001: unresolved external symbol _cvLoadImage

Debug/LoadImage01.exe : fatal error LNK1120: 6 unresolved externals

执行 link.exe 时出错.

解决办法:工程-》设置-》连接中,添加对象/库模块cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib即可,如下图(需要用到即可加载几个)。



6. 图像显示路径问题

if((pImg=cvLoadImage("E:\毕业论文 相关\VC 程序 练习 201108\LoadImage01\testpic.jpg",1))==0)

提示警告错误:warning C4129: 'V' : unrecognized character escape sequence

解决办法:单斜杠变成双斜杠。(双引号括起来)。


7. 编译没错误,运行后出现错误窗口,如下所示:

bad flag(parameter or structure field)(Unrecognized or unsupported array type)

 

while(1)   // !!<葉正聖老師教研究生學opencv [程式集訓]>

{image=cvQueryFrame(capture1);

cvSaveImage("frame0.jpg",image);

cvShowImage("Tracking Demo","frame0.jpg");。。。。。。}

解决办法:图像显示函数中的"frame0.jpg"改成image即可。


8.  程序运行中,按Esc键,出现错误报警窗口,或者内存释放语句放在图像显示循环语句中,只显示了第一帧就报错。

Unknown error code -49 (Deallocation error) in function cvFree_,C:\User\VP\ opencv\cxcore\src\cxalloc.cpp(129)

 

解决办法:image=cvQueryFrame(pCapture))返回的图像image用cvReleaseImage释放了!把语句“cvReleaseImage(&image);”去掉。切记,cvQueryFrame获得的指针千万不能释放!


9. cvCopy和cvCvtColor函数对图像处理后,图像上下变反,倒置了,左右没反。

 

解决办法:图像的origin参数变了,设置为1即可,加代码“GrayImage->origin=1;”。

原因为cvCreateImage得到的图像文件,其origin都为0,而从摄像头或视频文件中获取的帧图像,其origin都为1.



10. 运行完了之后,出现错误报警窗口:Null pointer (NULL array pointer is passed) in function cvGetMat,C:\User\VP\opencv\cxcore\src\cxarray.cpp(2780).

 

解决办法:判断是否抓取的最后一帧,若是,image=cvQueryFrame(capture1);返回的指针为NULL,这时用语句break退出, if (image==NULL) break;。

或者,图像格式都初始化一样的,如channel都取1(单通道,灰度图像)。


11. 把语句cvSaveImage("frame0.jpg",image); 去掉,则出现下面的错误:Bad argument (Array should be CvMat or IplImage) in function cvGetSize, C:\User\ VP\opencv\cxcore\src\cxarray.cpp(1453).

 


解决办法:cvGetSize(image)中image未提前定义大小,把image=cvQueryFrame(capture1);放在之前即可。


12.加入计算灰度直方图的函数,编译没有错误,运行之后Tracking Demo闪了一下,然后没反应。

调试运行,到函数int* GetGrayhist(IplImage *img)的内部语句int i=ptr[x];时停止运行,提示警告窗口如下。“Unhandled exception in VideoReadSave.exe:0xc0000005:Access Violation.”

 

解决办法:把函数体内两个for循环之内的语句“uchar* ptr=(uchar*)(img->imageData+y*img->widthStep);”放到后一个for语句体内,改成“i=((uchar*)(img->imageData+y*img->widthStep))[x];”。



20120306

13. error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'struct _IplImage *' (or there is no acceptable conversion)

错误指向语句img02 = cvCreateImage( cvGetSize(img00), IPL_DEPTH_8U, 3);

解决办法:变量批量定义时,指针“*”容易忘记写,语句:IplImage* img01,img02;

改成IplImage* img01,*img02;


14.问题描述: 

 

原因:数组越界,图像的宽和高与矩阵中的(x,y)的区别。

解决办法:for (int y=0;y<img00->height;y++)

{

for (int x=0;x<img00->width;x++)

{

s=cvGet2D(img00,x,y);//Get the x,y) pixel value

x和y顺序对调。注意,在图像矩阵中,(y,x)表示y行x列的点。


15. error C2065: 'cout' : undeclared identifier

error C2296: '<<' : illegal, left operand has type 'double'

原因:include中的<iostream>没有定义全局命名空间。

解决办法:要么包含<iostream.h>,要么在程序中加 using namespace std。


16. “Linking...

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

Debug/临界区.exe : fatal error LNK1120: 2 unresolved externals

执行 link.exe 时出错.

临界区.exe - 1 error(s), 0 warning(s)”

原因:这是线程同步中遇到的问题,使用CCriticalSection类操作临界区,由于CCriticalSection类是MFC中所定义的临界区类,因此所用的控制台程序的工程必须设置对MFC包含。

解决办法:点击“工程”菜单,选择“设置”,在“Project Settings”对话框中选择“常规”项,在“Microsoft基础类”的下拉菜单中选择“使用MFC作为共享的DLL”,点击“确定”即可。

 

17. 编译时出现错误:“LINK : fatal error LNK1168: cannot open Debug/基于PT转台的视频跟踪软件设计.exe for writing”

原因:上次运行程序没有关闭,程序还在运行过程中。到“任务管理器”中,看是否有你编译的程序在运行,强制关闭后,再编译。

 

18. 编写了一个MFC程序,运行后点击一个按钮,界面变成没有响应,.exe文件在Windows任务管理器中也删除不了?

解决办法:CPTDlg::OnBTSetVideo()函数中加“初始化视频调节窗口”语句。


19. VC异常处理

问题描述:工作区内不显示新加的类名(类不显示)

解决办法:删除.clw和.ncb文件,然后类向导里面加入.clw文件;或者工程-增加到工程-文件  然后选择你的.CPP和.H文件,加入后类窗口中即可显示新类。


20. VC工程:摄像机读入视频Learning_OpenCV_CH2.cpp

 

//From:E:\毕业论文 相关\更新 Filter Research\OpenCV\LearningOpenCV_Code\ch2_ex2_9.cpp

问题描述:编译时,出现Debug Error! abnormal program termination。

 

Abnormal program termination    程序异常终止。通常是由于内存使用不当所致

解决办法:目前还没有解决,考虑是否因为帧频间隔时间和cvWaitKey(n)中的n不一致所致?或者图像缓存的空间设置问题等??!!!


21. 为了//加载位图改变界面背景20120328  <VC之美化界面篇。。。.pdf>,在CPTDlg的构造函数中加 CDC* pDC      = GetDC();

 

解决办法:

pDC定义的位置得改变。pDC = GetDC();放入函数BOOL CPTDlg::OnEraseBkgnd(CDC* pDC)

!?还是不能加载图片到对话框界面上!!!???


22. 问题描述:基于PT转台的视频跟踪软件设计Dlg.obj : error LNK2001: unresolved external symbol _cvCreateImage

解决办法:除了gt400.lib DrawUtil.lib Raw2Rgb.lib IEUCap.lib文件外,工程->设置->连接->对象/库模块中添加所需的OpenCV库文件如下图所示,

 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

 

23. 

问题描述:

添加类型转换函数GetIplFromBmp,然后在窗口显示,调试没有问题,运行后出现下列错误OpenCV GUI Error Handler:

One of arguments’ values is out of range (Negative or too large argument of cvAlloc function) in function cvAlloc,C:\User\VP\opencv\ cxcore\src\cxalloc.cpp (106)

 

分析:

   cxalloc.cpp 文件中

r105 if( (size_t)size > CV_MAX_ALLOC_SIZE )

r106       CV_ERROR( CV_StsOutOfRange,

r107           "Negative or too large argument of cvAlloc function" );

单步调试运行,出现下列错误Unhandled exception in ….exe (MSVCRTD.DLL): 0xC0000005:Access Violation.

 

解决办法:由于使用了别人提供的由BMP转换为IplImage的类型转换函数GetIplFromBmp,建议使用OpenCV自带的cvSetData函数(From《OpenCV例程说明》),见问题25。


24. 20120406

把IEU_MSG消息处理函数IEUMsgProc中的语句cvNamedWindow("图像显示",1);cvShowImage("图像显示",Iimage);注释掉,出现下面错误。

OpenCV GUI Error Handler:Unknown error code -25 (Bad input roi) in function cvInitImageHeader,C:\User\VP\opencv\cxcore\src\cxarray.cpp (3363)

 

R3362    if( size.width < 0 || size.height < 0 )

R3363        CV_ERROR( CV_BadROISize, "Bad input roi" );


解决办法:把Iimage=GetIplFromBmp(m_pDataBuf);注释掉,程序正常运行,图像显示窗口也出现,只是没有Iimage图像而已。

 

25. 

//From<OpenCV例程说明>

CvSize cvSize;

cvSize.width   =  m_nImageWidth;

cvSize.height  =  m_nImageHeight;

IplImage* iplImage = cvCreateImageHeader (cvSize,IPL_DEPTH_8U,1);

消息处理函数的循环体内加语句cvSetData(iplImage,m_pDataBuf,m_nImageWidth);

调试没问题,运行后出现了显示图像的窗口,但出现下列错误

 

r127        CVStatus status = p_cvFree( ptr, p_cvAllocUserData );

r128        if( status < 0 )

r129            CV_ERROR( status, "Deallocation error" );


解决办法:参见上面的问题8,把cvReleaseImage(&iplImage);注释掉即可。


26.

e:\毕业论文 相关\vc 程序 练习 201108\ch10 ex 10 2学习opencv\ch10 ex 10 2学习opencv.cpp(132) : fatal error C1010: unexpected end of file while looking for precompiled header directive cvx_defs.cpp

e:\毕业论文 相关\vc 程序 练习 201108\ch10 ex 10 2学习opencv\cvx_defs.cpp(41) : fatal error C1010: unexpected end of file while looking for precompiled header directive Generating Code... 

并且光标指向两个文件的末尾处。

原因:“可能原因为工程中 stdafx.h 未包含。

//

   在VC 6.0中编译c++程序时报该错原因为需要一个预编译的文件stdafx.h, 如果不需要编译该头文件的话,只需要打开seting 页面设置中在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头,解决这个问题。”

解决办法:

    工程-》设置-》C/C++,在分类中选择“预编译的头文件”,在下面的选项中选择第一个“不使用预补偿页眉”,确定即可。

 

27. 帧间差分图像是有拖影的图像《VC工程:Camshift目标跟踪-边缘检测》

  

原因:hue为每帧图像转化成了的灰度图像,

if(icount==2)  //判断是否第一帧(之前定义了int icount=1)

{

cvCopy(hue, image1, NULL);  //是第一帧则把它复制到image1中

}

cvCopy(hue, image2, NULL);   //把每帧的灰度图像复制到image2中

cvAbsDiff(image1, image2, hue); //当前帧减去上一帧,保存在hue中

//注意,若是第一帧,则是自身相减

循环后面加得到上一帧图像的语句,即把当前帧作为下一帧的前一帧

cvCopy(hue,image1,NULL);

此时hue为差分后的图像,而不是原始图像,故出现疑似拖尾现象。

解决办法: cvCopy(hue,image1,NULL);hue改成image2。


28. error C2064: term does not evaluate to a function;

指向程序语句:histimg = cvCreateImage( cvSize(320, 200), 8, 3 );

原因:存在函数未被定义或者重复定义!!!

解决办法:

仔细检查,cvSize是opencv的函数,获得CvSize类型,cvCreateImage也是opencv的函数,搜索cvSize,发现之前有一条语句“CvSize cvSize;”,把函数cvSize定义成了变量,把它改成cvsize,编译通过。

后记:定义变量时,一定要避开相关关键字和函数名,切记!!


29. OpenCV GUI Error Handler:

Formats of input arguments do not match()in function cvCopy

 

原因:cvCopy( iplImage, image, 0 );中的iplImage之前定义为一通道的(灰度图像),而image为三通道的(彩色图像),格式不匹配。

把IplImage定义为3通道的,然后点击“打开相机”,出现下面错误:

Image step is wrong()in function cvSetData,

 


把image改成单通道的(灰度图像)???!!!变成处理黑白图像???!!!

解决办法:

//20120421 把m_pDataBuf换成m_pRgbBuf(彩色图像数据) ,并且之前的CreateImage通道为3

  cvSetData(iplImage,m_pRgbBuf,m_nImageWidth*3);//末尾参数应该乘以3!!!


30. Linking...

LINK :fatal error LNK1168: cannot open Debug /基于PT转台的视频跟踪软件设计.exe for writing

原因:.exe程序正在运行,不能重写。

解决办法:在任务管理器中,把进程.exe关掉!!


31.

error C2664: 'cvSetMouseCallback' : cannot convert parameter 2 from 'void (int,int,int,int,void *)' to 'void (__cdecl *)(int,int,int,int,void *)

'

        None of the functions with this name in scope match the target type

原因:

解决办法:将on_mouse函数定义成静态函数static。

接着出现以下错误:

error C2597: illegal reference to data member 'CPTDlg::select_object' in a static member function

解决办法:静态函数要访问类的非静态成员,需做以下处理

MylplClass* temp= (MylplClass*) param; 

switch(event){


case CV_EVENT_MOUSEMOVE: {


temp->a=...;


temp->b=...;

......}


...... }


}


32.

               cvNamedWindow("帧差后的图像iplImage3",1);

cvShowImage("帧差后的图像iplImage3",iplImage3);

运行后图像窗口一直在闪烁!

解决办法:把窗口名字中的iplImage3去掉即可正常显示。

或者改成其它的,不用图像变量iplImage3即可,猜测可能是窗口名字与变量冲突!!

?cvDestroyWindow的缘故??


33.

cvSaveImage(szSaveName,iplImage4);出错??

 

解决办法:

图片保存的文件名应该指明图片格式,在此,应该给szSaveName添加.jpg字符,代码如下: 

char *last_name=".jpg"; strcat(szSaveName,last_name);


本文转载自http://blog.sina.com.cn/s/blog_6646924501012wnw.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值