VC6.0应用OpenCV时出现的错误及解决办法

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.
 
点击调试
 
????


33.
               cvNamedWindow("帧差后的图像iplImage3",1);
cvShowImage("帧差后的图像iplImage3",iplImage3);
运行后图像窗口一直在闪烁!
解决办法:把窗口名字中的iplImage3去掉即可正常显示。
或者改成其它的,不用图像变量iplImage3即可,猜测可能是窗口名字与变量冲突!!
?cvDestroyWindow的缘故??


34.
cvSaveImage(szSaveName,iplImage4);出错??
 
解决办法:
图片保存的文件名应该指明图片格式,在此,应该给szSaveName添加.jpg字符,代码如下: 
char *last_name=".jpg"; strcat(szSaveName,last_name);

你可能感兴趣的:(VC6.0应用OpenCV时出现的错误及解决办法)