C++ 将OpenCV Mat转换为“a”;位掩码“;

C++ 将OpenCV Mat转换为“a”;位掩码“;,c++,opencv,C++,Opencv,我目前正在使用openCV获取一些ascii字符的位掩码 为此,我使用以下代码: //在本例中,某些include可能没有用处 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(){ cv::Mat tmp=cv::Mat(64,64,cv_8UC3,cv::Scalar(0,0,0)); cv::putText(tmp, ".", cv::点(31,31), cv::FONT\u HERSHEY\u平原, 1. CV_RGB(255、255、255) ); 对

我目前正在使用openCV获取一些ascii字符的位掩码

为此,我使用以下代码:

//在本例中,某些include可能没有用处
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
cv::Mat tmp=cv::Mat(64,64,cv_8UC3,cv::Scalar(0,0,0));
cv::putText(tmp,
".", 
cv::点(31,31),
cv::FONT\u HERSHEY\u平原,
1.
CV_RGB(255、255、255)
);
对于(int y=0;y=0)
打破
};
}
从这一点上,我希望在标准输出上看到一个64*64的正方形,填充了大量的0(代表黑色像素)和255(代表白色像素),其中白色像素将形成一个点

但是结果输出是64*64平方,只有0

我真的不明白我做错了什么

此外,我还尝试使用
tmp.data
而不是
tmp.at
,但结果是一样的。当我尝试从
tmp.data
迭代到
tmp.dataend
时,这也不起作用(这次我有更多的0,但仍然没有255个)

忘了提到,最终目标是将图像存储为
uint8\u t*
数组,因此如果我不需要经过1000个步骤就可以直接获得
uint8\u t*
,我也会接受帮助

总的来说,任何帮助都将不胜感激。
尽管评论指出您需要一个频道图像(CV_8UC1)而不是三个频道,但您或其他人可能会想知道为什么上面的代码不能按预期工作

查看的源代码,您会发现其结果所在的内存地址取决于模板参数。例如,如果
tmp.data
0x55ed6bb8d1c0
,则:

  • tmp.at(30,31)
    位于
    0x55ed6bb8e85f
    5791(30*64*3+31)字节,来自
    tmp.data
  • tmp.at(30,31)
    位于
    0x55ed6bb8e89d
    5853(30*64*3+31*3)字节来自
    tmp.data
上面的代码永远无法读取值为
{255,255,255}
的像素。这就是为什么它只输出
0


使用
uchar val=tmp.at(y,x)[0]
可以让它工作。

使用带有
CV_8UC1
的单通道图像,而不是
3
=>打印时,你看到点了吗?此外,文本可能要显示的像素数最少,并且可能高于64I。有没有理由将你的点绘制为测试点,而不仅仅是一个“正常圆”?@Ivan yeah点只是一个例子,我正试图获得一些ascii字符的位掩码,然后去掉opencv。实际上,当我通过
imshow(“点”,tmp)
显示图像时,putText是唯一让我坚持使用它的东西,这就是为什么我希望数据的值不是0CV\u 8UC1。。。。。。。。。。