是这样的,在一个函数体内做如下定义:
for( x = 0; x < width; x++ )
{
int x1 = xmap[x]*3;
const uchar* p2 = imgPtr + xmap[x+1]*3;
const uchar* p0 = imgPtr + xmap[x-1]*3;
float dx0, dy0, dx, dy, mag0, mag;
dx0 = lut[p2[2]] - lut[p0[2]];
dy0 = lut[nextPtr[x1+2]] - lut[prevPtr[x1+2]];
mag0 = dx0*dx0 + dy0*dy0;
我在监视窗口里面,一个个打入 float dx0, dy0, dx, dy, mag0, mag; 一行的所有变量。
程序运行到 dy0=... 一行的时候,监视窗口中只能显示dx的值。其它全是: CXX0017: 错误: 没有找到符号“dx0” 之类。
真奇怪,难道是vs2010的bug?记得当时vs2005刚出的时候就遇到了好几个不可思议的地方,也是在跟踪代码的时候发现的。
14 个解决方案
#1
真是,上面是在debug模式下的,而且运行结果也不对,这个for循环是用来更新一个数组中的值的,结果for结束掉之后数组中的值没变。
但是,但是,但是我把编译模式换成release之后,一切的一切,TNND就正常了!!!!
#2
如果要我猜的话可能是变量没有被用到的时候编译器还没有为其分配空间,但是这是release开关下常有的事,debug都很老常的说,没用过vs2010,不评价。
#3
没用过vs2010
用的debug模式,而且自己没去设置过优化开关?
用的debug模式,而且自己没去设置过优化开关?
#4
dx0被用到了啊,已经赋完值了嘛,而dx没用到却能显示!点了旁边的刷新按钮也不行。
除了添加库文件、include路径,其它项目设置都是默认。win32控制台程序。
#5
又有新情况,release模式下也有别的问题,一个结构体的构造函数,参数一样,release和debug模式下的得到的值却不一样。
唉,CSDN为何不让上传图片呢?有图片一目了然啊
唉,CSDN为何不让上传图片呢?有图片一目了然啊
#6
上传到博客
#7
贴下你完整函数的代码看看,不用贴图了
#8
你可以向去给微软要钱了
#9
你的变量声明不是放在函数体最开始?
我的vs2010 必须把变量声明放到函数体最开始。
我的vs2010 必须把变量声明放到函数体最开始。
#10
vs还有一个auto窗口 ,里面有所有临时 ,或者是程序中可用的变量的所有值
#11
#include "QuickHOG.h"
using namespace cv;
void QuickHOG::computeGradient(const Mat& img, Mat& grad, Mat& qangle,
Size paddingTL, Size paddingBR) const
{
CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 );
Size gradsize(img.cols + paddingTL.width + paddingBR.width,
img.rows + paddingTL.height + paddingBR.height);
//耗时
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation
Size wholeSize;
Point roiofs;
img.locateROI(wholeSize, roiofs); //yang// why?
int i, x, y;
int cn = img.channels();
Mat_<float> _lut(1, 256);
const float* lut = &_lut(0,0); //yang// quick
if( gammaCorrection )
for( i = 0; i < 256; i++ )
_lut(0,i) = std::sqrt((float)i);
else
for( i = 0; i < 256; i++ )
_lut(0,i) = (float)i;
AutoBuffer<int> mapbuf(gradsize.width + gradsize.height + 4);
int* xmap = (int*)mapbuf + 1;
int* ymap = xmap + gradsize.width + 2;
const int borderType = (int)BORDER_REFLECT_101;
//耗时
for( x = -1; x < gradsize.width + 1; x++ )
xmap[x] = borderInterpolate(x - paddingTL.width + roiofs.x,
wholeSize.width, borderType) - roiofs.x;
for( y = -1; y < gradsize.height + 1; y++ )
ymap[y] = borderInterpolate(y - paddingTL.height + roiofs.y,
wholeSize.height, borderType) - roiofs.y;
// x- & y- derivatives for the whole row
int width = gradsize.width;
AutoBuffer<float> _dbuf(width*4);
float* dbuf = _dbuf;
Mat Dx(1, width, CV_32F, dbuf);
Mat Dy(1, width, CV_32F, dbuf + width);
Mat Mag(1, width, CV_32F, dbuf + width*2);
Mat Angle(1, width, CV_32F, dbuf + width*3);
int _nbins = nbins;
float angleScale = (float)(_nbins/CV_PI);
for( y = 0; y < gradsize.height; y++ )
{
const uchar* imgPtr = img.data + img.step*ymap[y];
const uchar* prevPtr = img.data + img.step*ymap[y-1];
const uchar* nextPtr = img.data + img.step*ymap[y+1];
float* gradPtr = (float*)grad.ptr(y);
uchar* qanglePtr = (uchar*)qangle.ptr(y);
if( cn == 1 )
{
for( x = 0; x < width; x++ )
{
int x1 = xmap[x];
dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
}
}
else
{
for( x = 0; x < width; x++ )
{
int x1 = xmap[x]*3;
const uchar* p2 = imgPtr + xmap[x+1]*3;
const uchar* p0 = imgPtr + xmap[x-1]*3;
float dx0, dy0, dx, dy, mag0, mag;
dx0 = lut[p2[2]] - lut[p0[2]];
dy0 = lut[nextPtr[x1+2]] - lut[prevPtr[x1+2]];
mag0 = dx0*dx0 + dy0*dy0;
dx = lut[p2[1]] - lut[p0[1]];
dy = lut[nextPtr[x1+1]] - lut[prevPtr[x1+1]];
mag = dx*dx + dy*dy;
if( mag0 < mag )
{
dx0 = dx;
dy0 = dy;
mag0 = mag;
}
dx = lut[p2[0]] - lut[p0[0]];
dy = lut[nextPtr[x1]] - lut[prevPtr[x1]];
mag = dx*dx + dy*dy;
if( mag0 < mag )
{
dx0 = dx;
dy0 = dy;
mag0 = mag;
}
dbuf[x] = dx0;
dbuf[x+width] = dy0;
}
}
cartToPolar( Dx, Dy, Mag, Angle, false );
for( x = 0; x < width; x++ )
{
float mag = dbuf[x+width*2], angle = dbuf[x+width*3]*angleScale - 0.5f;
int hidx = cvFloor(angle);
angle -= hidx;
if( hidx < 0 )
hidx += _nbins;
else if( hidx >= _nbins )
hidx -= _nbins;
assert( (unsigned)hidx < (unsigned)_nbins );
qanglePtr[x*2] = (uchar)hidx;
hidx++;
hidx &= hidx < _nbins ? -1 : 0;
qanglePtr[x*2+1] = (uchar)hidx;
gradPtr[x*2] = mag*(1.f - angle);
gradPtr[x*2+1] = mag*angle;
}
}
}
#12
这个是C语言的规矩吧?
自动窗口里面只有dx,同一行中的其它变量没有显示。
我用的是win7,补丁打到今天刚刚发布的那些。vs2010是简体中文旗舰版。
#13
opencv的库用的时候debug和release模式要和应用程序的对应,不然imread("..\\Images\\test.bmp")之类的函数读不出数据。但我在代码里面是这样用的:
#pragma once
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#ifdef _DEBUG
#pragma comment(lib, "opencv_core220d.lib")
#pragma comment(lib, "opencv_imgproc220d.lib")
#pragma comment(lib, "opencv_objdetect220d.lib")
#else
#pragma comment(lib, "opencv_core220.lib")
#pragma comment(lib, "opencv_imgproc220.lib")
#pragma comment(lib, "opencv_objdetect220.lib")
#endif
#14
嗯,又重新浏览了下帖子的所有回复。
感觉起来就是一个常见问题: debug和release运行状态不一致。
这个一般都是内存结构被破坏所致,由于这个原因,可能就会引起很多其他莫名其妙的问题。
如果可以的话,我想向楼主要份代码。
感觉起来就是一个常见问题: debug和release运行状态不一致。
这个一般都是内存结构被破坏所致,由于这个原因,可能就会引起很多其他莫名其妙的问题。
如果可以的话,我想向楼主要份代码。
#1
真是,上面是在debug模式下的,而且运行结果也不对,这个for循环是用来更新一个数组中的值的,结果for结束掉之后数组中的值没变。
但是,但是,但是我把编译模式换成release之后,一切的一切,TNND就正常了!!!!
#2
如果要我猜的话可能是变量没有被用到的时候编译器还没有为其分配空间,但是这是release开关下常有的事,debug都很老常的说,没用过vs2010,不评价。
#3
没用过vs2010
用的debug模式,而且自己没去设置过优化开关?
用的debug模式,而且自己没去设置过优化开关?
#4
dx0被用到了啊,已经赋完值了嘛,而dx没用到却能显示!点了旁边的刷新按钮也不行。
除了添加库文件、include路径,其它项目设置都是默认。win32控制台程序。
#5
又有新情况,release模式下也有别的问题,一个结构体的构造函数,参数一样,release和debug模式下的得到的值却不一样。
唉,CSDN为何不让上传图片呢?有图片一目了然啊
唉,CSDN为何不让上传图片呢?有图片一目了然啊
#6
上传到博客
#7
贴下你完整函数的代码看看,不用贴图了
#8
你可以向去给微软要钱了
#9
你的变量声明不是放在函数体最开始?
我的vs2010 必须把变量声明放到函数体最开始。
我的vs2010 必须把变量声明放到函数体最开始。
#10
vs还有一个auto窗口 ,里面有所有临时 ,或者是程序中可用的变量的所有值
#11
#include "QuickHOG.h"
using namespace cv;
void QuickHOG::computeGradient(const Mat& img, Mat& grad, Mat& qangle,
Size paddingTL, Size paddingBR) const
{
CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 );
Size gradsize(img.cols + paddingTL.width + paddingBR.width,
img.rows + paddingTL.height + paddingBR.height);
//耗时
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation
Size wholeSize;
Point roiofs;
img.locateROI(wholeSize, roiofs); //yang// why?
int i, x, y;
int cn = img.channels();
Mat_<float> _lut(1, 256);
const float* lut = &_lut(0,0); //yang// quick
if( gammaCorrection )
for( i = 0; i < 256; i++ )
_lut(0,i) = std::sqrt((float)i);
else
for( i = 0; i < 256; i++ )
_lut(0,i) = (float)i;
AutoBuffer<int> mapbuf(gradsize.width + gradsize.height + 4);
int* xmap = (int*)mapbuf + 1;
int* ymap = xmap + gradsize.width + 2;
const int borderType = (int)BORDER_REFLECT_101;
//耗时
for( x = -1; x < gradsize.width + 1; x++ )
xmap[x] = borderInterpolate(x - paddingTL.width + roiofs.x,
wholeSize.width, borderType) - roiofs.x;
for( y = -1; y < gradsize.height + 1; y++ )
ymap[y] = borderInterpolate(y - paddingTL.height + roiofs.y,
wholeSize.height, borderType) - roiofs.y;
// x- & y- derivatives for the whole row
int width = gradsize.width;
AutoBuffer<float> _dbuf(width*4);
float* dbuf = _dbuf;
Mat Dx(1, width, CV_32F, dbuf);
Mat Dy(1, width, CV_32F, dbuf + width);
Mat Mag(1, width, CV_32F, dbuf + width*2);
Mat Angle(1, width, CV_32F, dbuf + width*3);
int _nbins = nbins;
float angleScale = (float)(_nbins/CV_PI);
for( y = 0; y < gradsize.height; y++ )
{
const uchar* imgPtr = img.data + img.step*ymap[y];
const uchar* prevPtr = img.data + img.step*ymap[y-1];
const uchar* nextPtr = img.data + img.step*ymap[y+1];
float* gradPtr = (float*)grad.ptr(y);
uchar* qanglePtr = (uchar*)qangle.ptr(y);
if( cn == 1 )
{
for( x = 0; x < width; x++ )
{
int x1 = xmap[x];
dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
}
}
else
{
for( x = 0; x < width; x++ )
{
int x1 = xmap[x]*3;
const uchar* p2 = imgPtr + xmap[x+1]*3;
const uchar* p0 = imgPtr + xmap[x-1]*3;
float dx0, dy0, dx, dy, mag0, mag;
dx0 = lut[p2[2]] - lut[p0[2]];
dy0 = lut[nextPtr[x1+2]] - lut[prevPtr[x1+2]];
mag0 = dx0*dx0 + dy0*dy0;
dx = lut[p2[1]] - lut[p0[1]];
dy = lut[nextPtr[x1+1]] - lut[prevPtr[x1+1]];
mag = dx*dx + dy*dy;
if( mag0 < mag )
{
dx0 = dx;
dy0 = dy;
mag0 = mag;
}
dx = lut[p2[0]] - lut[p0[0]];
dy = lut[nextPtr[x1]] - lut[prevPtr[x1]];
mag = dx*dx + dy*dy;
if( mag0 < mag )
{
dx0 = dx;
dy0 = dy;
mag0 = mag;
}
dbuf[x] = dx0;
dbuf[x+width] = dy0;
}
}
cartToPolar( Dx, Dy, Mag, Angle, false );
for( x = 0; x < width; x++ )
{
float mag = dbuf[x+width*2], angle = dbuf[x+width*3]*angleScale - 0.5f;
int hidx = cvFloor(angle);
angle -= hidx;
if( hidx < 0 )
hidx += _nbins;
else if( hidx >= _nbins )
hidx -= _nbins;
assert( (unsigned)hidx < (unsigned)_nbins );
qanglePtr[x*2] = (uchar)hidx;
hidx++;
hidx &= hidx < _nbins ? -1 : 0;
qanglePtr[x*2+1] = (uchar)hidx;
gradPtr[x*2] = mag*(1.f - angle);
gradPtr[x*2+1] = mag*angle;
}
}
}
#12
这个是C语言的规矩吧?
自动窗口里面只有dx,同一行中的其它变量没有显示。
我用的是win7,补丁打到今天刚刚发布的那些。vs2010是简体中文旗舰版。
#13
opencv的库用的时候debug和release模式要和应用程序的对应,不然imread("..\\Images\\test.bmp")之类的函数读不出数据。但我在代码里面是这样用的:
#pragma once
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#ifdef _DEBUG
#pragma comment(lib, "opencv_core220d.lib")
#pragma comment(lib, "opencv_imgproc220d.lib")
#pragma comment(lib, "opencv_objdetect220d.lib")
#else
#pragma comment(lib, "opencv_core220.lib")
#pragma comment(lib, "opencv_imgproc220.lib")
#pragma comment(lib, "opencv_objdetect220.lib")
#endif
#14
嗯,又重新浏览了下帖子的所有回复。
感觉起来就是一个常见问题: debug和release运行状态不一致。
这个一般都是内存结构被破坏所致,由于这个原因,可能就会引起很多其他莫名其妙的问题。
如果可以的话,我想向楼主要份代码。
感觉起来就是一个常见问题: debug和release运行状态不一致。
这个一般都是内存结构被破坏所致,由于这个原因,可能就会引起很多其他莫名其妙的问题。
如果可以的话,我想向楼主要份代码。