我有一个关于代码和平的问题。
...............
cv::Mat image;
image = cv::imread(filename.c_str(), CV_LOAD_IMAGE_COLOR);
if (image.empty()) {
std::cerr << "Couldn't open file: " << filename << std::endl;
exit(1);
}
cv::cvtColor(image, imageRGBA, CV_BGR2RGBA);
imageGrey.create(image.rows, image.cols, CV_8UC1);
*inputImage = (uchar4 *)imageRGBA.ptr<unsigned char>(0);
*greyImage = imageGrey.ptr<unsigned char>(0);
据我所知,我们创建了一个openCV mat对象。将图像读入其中。但是为什么我们使用filename.c_str()?而不只是文件名?为什么我们将BGR转换为RGBA?
cv::cvtColor(image, imageRGBA, CV_BGR2RGBA);
我在文档中读到imread将图像读取为RGB而不是BGR。
对我们来说最令人困惑的是这部分:
*inputImage = (uchar4 *)imageRGBA.ptr<unsigned char>(0);
*greyImage = imageGrey.ptr<unsigned char>(0);
这里发生了什么?为什么我们需要所有这些演员? 我知道这是一个很多问题,但我真的想知道这里发生了什么。)
答案 0 :(得分:5)
const char*
作为第一个参数,您无法直接将std::string
传递给它Mat::ptr()
是模板化的(它不是强制转换!),因为Mat隐藏了您的数据类型。代码是有风险的,因为它只是假设imread将创建Mat_<uchar>
,因此这是正确的访问类型。最好先从cv::Mat_<uchar>
开始,然后使用Mat_<T>::operator[]
获取指向第一行的指针等。