OpenCV:内存位置问题

kgqe7b3p  于 2023-03-23  发布在  其他
关注(0)|答案(3)|浏览(166)

我刚刚安装了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++异常:std::bad_alloc at memory location 0x006AECD4.

int a = countNonZero(M);

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

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

导致:myOpenCVStudy.exe中0x734ADE19(msvcp100.dll)处出现未处理异常:0xC0000005:阅读位置0x00000000时发生访问冲突。
对于第二种情况,我得到一个“没有加载符号”。关于C:\Windows\SysWoW64\KernelBase.dll的东西。说我需要更改PDB和二进制搜索路径(Microsoft Symbol Server),它是如何完成的。
会很感激你的帮助,
谢谢你,
耶尔

nc1teljy

nc1teljy1#

创建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崩溃的原因可能是因为根据文档,它期望的是单通道输入,而不是双通道输入。在Debug模式下运行应该会导致适当的Assert。
如果你真的想要一个doubles的单通道镜像,只要在创建它的时候将类型改为CV_64F

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

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

int a = countNonZero(M);
doinxwow

doinxwow2#

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

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

c3frrgcw3#

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

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

相关问题