OpenCV:内存位置问题

时间:2015-01-30 09:53:08

标签: c++ windows opencv memory pdb

我刚刚安装了opencv 2.4.10。我使用免费版的visual studio。 它编译opencv命令,我能够在窗口上显示我的计算机摄像头输入。 但是,似乎任何访问Mat对象中的值的尝试都会失败。如果我从(例如)开始:

Mat M;
M.create(4, 4, CV_8UC(2));

我可以看到M不是空的,但是:

double b = M.at<double>(0, 0);

导致: myOpenCVStudy.exe中0x75C92F71处的未处理异常:Microsoft C ++异常:内存位置0x006AECD4处的std :: bad_alloc。

int a = countNonZero(M);

导致: myOpenCVStudy.exe中0x75C92F71处的未处理异常:Microsoft C ++异常:cv ::内存位置0x00ADF868处的异常。

cout << "M = " << endl << " " << M << endl << endl;

导致: myOpenCVStudy.exe中0x734ADE19(msvcp100.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

对于第二种情况,我得到一个&#34;没有加载符号&#34;。关于C:\ Windows \ SysWoW64 \ KernelBase.dll的事情。说我需要更改PDB和二进制搜索路径(Microsoft符号服务器),如何完成。

非常感谢您的帮助,

谢谢,

亚伊尔

3 个答案:

答案 0 :(得分:1)

创建Mat时,通过将CV_8UC(2)传递给create函数,将类型指定为两个8位无符号数据通道:

M.create(4, 4, CV_8UC(2));

通过强制转换为double 来尝试访问8个字节会导致问题:

double b = M.at<double>(0, 0);

因此,您需要使用Vec2b等适当的结构进行访问,该结构包含两个8位字节:

Vec2b b = M.at<Vec2b>(0, 0);

现在您可以访问两个频道中的每个频道的值:

unsigned char uCH1 = b[0];
unsigned char uCH2 = b[1];

countNonZero崩溃的原因可能是因为according to the documentation,它期待单通道输入,而不是双通道输入。在调试模式下运行应该会产生适当的断言。

如果你真的想要双声道的单通道图像,只需在创建时将类型更改为CV_64F

Mat M;
M.create(4, 4, CV_64F);

double b = M.at<double>(0, 0);

int a = countNonZero(M);

答案 1 :(得分:0)

您的图片有两个频道,请使用cv :: Vec2b而不是double

cv::Mat M;
M.create(4, 4, CV_8UC(2));
...
cv::Vec2b b = M.at<cv::Vec2b>(0, 0);

答案 2 :(得分:0)

尝试以这种方式创建垫子:

cv::Mat M = cv::Mat(2,2, CV_8UC3, Scalar(0,0,255));