C++程序用VS2010编译运行生成debug成功,但是生成release编译通过运行就崩溃,跪求大牛们帮忙,万分感谢!

wuding19891221 2013-04-10 02:25:41
代码如下:
// opencvtest.cpp : 定義主控台應用程式的進入點。
#include "stdafx.h"
#include "opencv\cv.hpp"
#include "opencv2\objdetect\objdetect.hpp"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\imgproc\imgproc.hpp"

#include <iostream>
#include <stdio.h>
#include <fstream>

using namespace std;
using namespace cv;

//String cascadeName = "D:\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";

IplImage* cutImage(IplImage* src, CvRect rect) {
cvSetImageROI(src, rect);
IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),
src->depth,
src->nChannels);

cvCopy(src,dst,0);
cvResetImageROI(src);
return dst;
}

IplImage* detect( Mat& img, CascadeClassifier& cascade, double scale)
{
int i = 0;
double t = 0;
vector<Rect> faces;
Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );

cvtColor( img, gray, CV_BGR2GRAY );
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
equalizeHist( smallImg, smallImg );

t = (double)cvGetTickCount();
cascade.detectMultiScale( smallImg, faces,
1.3, 2, CV_HAAR_SCALE_IMAGE,
Size(30, 30) );
t = (double)cvGetTickCount() - t;
//printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
{
IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, r->width, r->height));
return temp;
}

return NULL;
}
//画直方图用
int HistogramBins = 256;
float HistogramRange1[2]={0,255};
float *HistogramRange[1]={&HistogramRange1[0]};
int CompareHist(IplImage* image1, IplImage* image2)
{
IplImage* srcImage;
IplImage* targetImage;
if (image1->nChannels != 1) {
srcImage = cvCreateImage(cvSize(image1->width, image1->height), image1->depth, 1);
cvCvtColor(image1, srcImage, CV_BGR2GRAY);
} else {
srcImage = image1;
}

if (image2->nChannels != 1) {
targetImage = cvCreateImage(cvSize(image2->width, image2->height), srcImage->depth, 1);
cvCvtColor(image2, targetImage, CV_BGR2GRAY);
} else {
targetImage = image2;
}

CvHistogram *Histogram1 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
CvHistogram *Histogram2 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);

cvCalcHist(&srcImage, Histogram1);
cvCalcHist(&targetImage, Histogram2);

cvNormalizeHist(Histogram1, 1);
cvNormalizeHist(Histogram2, 1);

// CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA这两种都可以用来做直方图的比较,值越小,说明图形越相似
//printf("CV_COMP_CHISQR : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CHISQR));
//printf("CV_COMP_BHATTACHARYYA : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_BHATTACHARYYA));


// CV_COMP_CORREL, CV_COMP_INTERSECT这两种直方图的比较,值越大,说明图形越相似
//printf("CV_COMP_CORREL : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL));
printf("利用CV_COMP_INTERSECT函数获取的相似度如下 : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT));

cvReleaseHist(&Histogram1);
cvReleaseHist(&Histogram2);
if (image1->nChannels != 1) {
cvReleaseImage(&srcImage);
}
if (image2->nChannels != 1) {
cvReleaseImage(&targetImage);
}
return 0;
}
//String srcImage = "d:\\1.jpg";
//String targetImage = "d:\\4.jpg";
//String cascadeName = "D:\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
int main(int argc, char* argv[])
{


//从configure文件中读取配置信息
String a="abc",srcImage="abc",b="abc",targetImage="abc",c="abc",cascadeName="abc";
ifstream infile;
infile.open("D:\\opencvtest\\configure.txt"); //注意文件的路径
infile>>a>>srcImage>>b>>targetImage>>c>>cascadeName; //两行数据可以连续读出到变量里
infile.close();



CascadeClassifier cascade;
//namedWindow("image1");
//namedWindow("image2");
if( !cascade.load( cascadeName ) )
{
return -1;
}

Mat srcImg, targetImg;
IplImage* faceImage1;
IplImage* faceImage2;
srcImg = imread(srcImage);
targetImg = imread(targetImage);
faceImage1 = detect(srcImg, cascade, 1);
if (faceImage1 == NULL) {
return -1;
}
//cvSaveImage("d:\\face.jpg", faceImage1, 0);
faceImage2 = detect(targetImg, cascade, 1);
if (faceImage2 == NULL) {
return -1;
}
// cvSaveImage("d:\\face1.jpg", faceImage2, 0);
imshow("image1", Mat(faceImage1));
imshow("image2", Mat(faceImage2));

CompareHist(faceImage1, faceImage2);
cvWaitKey(0);
cvReleaseImage(&faceImage1);
cvReleaseImage(&faceImage2);
return 0;
}

...全文
1637 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-29
  • 打赏
  • 举报
回复
优化被禁用的Release版还算是真正的Release版吗?
tangzz_csdn 2015-12-29
  • 打赏
  • 举报
回复
我也遇到上述的问题,采用22楼的方法,问题解决了。但需要说明的是,除了22楼中的第一项改为禁用外,第三项也必须改为:是(/oi)。因为我的属性里面第一项本来就是禁用的,但还是出现VS2010编译通过,但是执行的时候出现"no source available"的错误,我将22楼的属性页的第三项改为是(/oi)就好了。
zhouxiaofeng1021 2015-12-29
  • 打赏
  • 举报
回复
点击中断 把调用堆栈拿来看看呗 以及你所使用的DLL版本 还有你的release版本的一些配置
  • 打赏
  • 举报
回复
百度百科里解释了release版本出错的几种可能, 查release版本, 楼主这个问题搞了3天 希望已经搞定了
a979652090 2014-08-25
  • 打赏
  • 举报
回复
LZ我也遇到你那个问题 问一个大神解决了 给你上图把
赵4老师 2014-05-06
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
[quote=引用 19 楼 xmubingo 的回复:] 你应该用的链接输入是debug版本的opencv library。你要改成release版本的lib,把lib名称里的d去掉。
这应该是常识吧。[/quote] 但人们往往最容易犯常识性错误。
赵4老师 2014-05-06
  • 打赏
  • 举报
回复
引用 19 楼 xmubingo 的回复:
你应该用的链接输入是debug版本的opencv library。你要改成release版本的lib,把lib名称里的d去掉。
这应该是常识吧。
BinGo 2014-05-06
  • 打赏
  • 举报
回复
你应该用的链接输入是debug版本的opencv library。你要改成release版本的lib,把lib名称里的d去掉。
haiouzsf 2014-04-09
  • 打赏
  • 举报
回复
我也出现了这样的问题,我的解决办法是: 1) 使用写log的方式,一步步跟踪 2) 这样的问题一般都在系统初始化发生的错误,我的错误发生在 str.Format(L"%s",pStr); 其中pStr的定义为:wchar_t* pStr = new wchar_t[nLen]; 而 str的定义为:CString str; 将以上代码修改为: str = pStr; 再次编译release版本就可以双击exe程序正常运行了。 PS:我的系统win7 64bit, visual studio 2013
碼上道 2013-10-19
  • 打赏
  • 举报
回复
引用 1 楼 wuding19891221 的回复:
没有会的人么,大家踊跃帮帮忙好吗?
对于在Debug版本上不崩溃但Release版本崩溃的程序,很有可能是Debug和Release版本的差异。例如Debug版本所有成员在构造时会被清0,而Release版本所有成员在构造时是内存里面的原始值,而且Debug有运行时库做保护,这些都会导致某些程序在Debug正常而Release崩溃。 解决思路: 1)在程序中加打印,通过程序崩溃之前的打印定位出错位置; 2)逐段注释代码,直到程序不崩溃为止。这种方法耗时较长,对程序员要求较高,而且对于那种不是必现的bug或者很难搭建执行环境的情况就较难处理了。 楼主还是要把栈打出来看看。
木_玉 2013-10-19
  • 打赏
  • 举报
回复
引用 10 楼 wuding19891221 的回复:
这是调试后的截图:大家帮帮看看,谢谢了
请问你的问题解决了吗,我也遇到了同样的问题,求指导啊
铁文 2013-04-12
  • 打赏
  • 举报
回复
参考http://blog.csdn.net/tiewen/article/details/8788950中“7.2 调试版本与发行版本”一节
酱油党 2013-04-12
  • 打赏
  • 举报
回复
你的OpenCV是1.0的?
wuding19891221 2013-04-11
  • 打赏
  • 举报
回复
大家帮我解决下呗,我把release的优化选项都关闭了,程序运行还是出现上图的错误。。。
wuding19891221 2013-04-11
  • 打赏
  • 举报
回复
wuding19891221 2013-04-11
  • 打赏
  • 举报
回复
这是调试后的截图:大家帮帮看看,谢谢了
赵4老师 2013-04-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 生成pdb文件
星星眼 2013-04-10
  • 打赏
  • 举报
回复
不要直接执行,点调试,再把callstack(就是栈回溯)的截图发一下。
wuding19891221 2013-04-10
  • 打赏
  • 举报
回复
有没有人啊。。。帮我解决下呗,救命啊!!!
wuding19891221 2013-04-10
  • 打赏
  • 举报
回复
release有哪些优化选项?能详细说下么?谢谢~
加载更多回复(6)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧