我的程序在32位Windows上奇怪地崩溃了。当函数返回
时,VS2010给了我一个错误:Windows在mat_test.exe中触发了一个断点。这可能是由于堆的损坏,这表明mat_test.exe或它加载的任何dll中存在错误。这也可能是由于用户按下F12,而mat_test.exe有焦点。输出窗口可能有更多的诊断信息。
如果我把INT64改成有符号的int,它工作得很好。这和opencv
有关系吗?opencv
的Mat_
是否支持INT64
数据类型?
#include <opencv.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
typedef signed __int64 INT64;
typedef unsigned char byte;
Mat imgcpy(Mat &ori_image);
Mat imgcpy(Mat &ori_image){
Mat img;
Mat_<float> img_;
Mat img_copy;
img_copy.create(8,8,CV_8U);
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
img_copy.at<byte>(i,j)=1;
cout<<img_copy<<endl;
const Size sz(9,9);
Mat_<float> scores(sz,0);
Mat_<INT64> Tig1 = Mat_<INT64>::zeros(sz), Tig2 = Mat_<INT64>::zeros(sz);
Mat_<INT64> Tig4 = Mat_<INT64>::zeros(sz), Tig8 = Mat_<INT64>::zeros(sz);
Mat_<byte> Row1 = Mat_<byte>::zeros(sz),Row2 = Mat_<byte>::zeros(sz);
Mat_<byte> Row4 = Mat_<byte>::zeros(sz),Row8 = Mat_<byte>::zeros(sz);
//cout << Tig1 << endl << endl;
for (int y=1;y<=8;y++)
{
//byte* G = img_copy.ptr<byte>(y-1);
INT64* T1 = Tig1.ptr<INT64>(y); // Binary TIG of current row
INT64* T2 = Tig2.ptr<INT64>(y);
INT64* T4 = Tig4.ptr<INT64>(y);
INT64* T8 = Tig8.ptr<INT64>(y);
INT64* Tu1 = Tig1.ptr<INT64>(y-1); // Binary TIG of upper row
INT64* Tu2 = Tig2.ptr<INT64>(y-1);
INT64* Tu4 = Tig4.ptr<INT64>(y-1);
INT64* Tu8 = Tig8.ptr<INT64>(y-1);
byte* R1 = Row1.ptr<byte>(y);
byte* R2 = Row2.ptr<byte>(y);
byte* R4 = Row4.ptr<byte>(y);
byte* R8 = Row8.ptr<byte>(y);
float *s = scores.ptr<float>(y);
for (int x=1;x<=8;x++)
{
//cout<<G[x-1];
//byte g = 1;//G[x-1];
//R1[x] = (R1[x-1] << 1) | ((g >> 4) & 1);
//R2[x] = (R2[x-1] << 1) | ((g >> 5) & 1);
//R4[x] = (R4[x-1] << 1) | ((g >> 6) & 1);
//R8[x] = (R8[x-1] << 1) | ((g >> 7) & 1);
T1[x] = (Tu1[x] << 8) | R1[x];
T2[x] = (Tu2[x] << 8) | R2[x];
T4[x] = (Tu4[x] << 8) | R4[x];
T8[x] = (Tu8[x] << 8) | R8[x];
//cout<<Tig1<<endl<<"n";
//cout<<Tig2<<endl<<"n";
//cout<<Tig4<<endl<<"n";
//cout<<Tig8<<endl<<"n";
//cout<<Row1<<endl<<"n";
//cout<<Row2<<endl<<"n";
//cout<<Row4<<endl<<"n";
//cout<<Row8<<endl<<"n";
//s[x] = dot(T1[x], T2[x], T4[x], T8[x]);
//T1[x]=1;
//T2[x]=1;
//T4[x]=1;
//T8[x]=1;
s[x]=y;
}
}
cout<<scores<<endl<<endl;
//cout<< scores(Rect(8,8,2,2)) <<endl<<endl;
scores(Rect(7,7,2,2)).copyTo(img);
cout<<img<<endl<<endl;
return img;
}
int main(){
Mat img;
Mat ori_img;
img = imgcpy(ori_img);
return 0;
}
我在调用vector析构函数时遇到了类似的问题,而且它是在另一台计算机上工作的。问题出在图书馆。我从另一台计算机上复制了编译好的库文件。他们的视觉工作室版本是不同的。这可能会导致您的问题,使用编译器构建opencv。
当visual studio版本改变时,c运行库版本改变。因此,您的代码可能会在运行时崩溃。当我用我的visual studio编译OpenCV时,我的问题解决了,我希望你的问题也能解决。