Разница между OpenCV типа CV_32F и CV_32FC1

Я хотел бы знать, есть ли какая-либо разница между типами OpenCV CV_32F и CV_32FC1? Я уже знаю, что 32F означает «32-битная плавающая точка», а C1 - «один канал», но дальнейшие пояснения приветствуются.

Если да, то чем они отличаются / какой из них следует использовать в каких конкретных случаях? Как вы, возможно, знаете, что типы openCV могут быть очень хитрыми ...

Заранее всем спасибо за помощь!

Ответы на вопрос(1)

CV_32F а такжеCV_32FC1 является5 (см. объяснение ниже), поэтому в численном отношении нет никакой разницы.

Тем не мение:

CV_32F определяет глубину каждого элемента матрицы, аCV_32FC1 определяет как глубину каждого элемента, так и количество каналов.

Несколько примеров ...

Многие функции, напримерСобела или жепреобразовать в, требуется глубина назначения (ине количество каналов), так что вы делаете:

Sobel(src, dst, CV_32F, 1, 0);

src.convertTo(dst, CV_32F);

Но, например, при создании матрицы необходимо также указать количество каналов, поэтому:

Mat m(rows, cols, CV_32FC1);

В принципе, каждый раз, когда вы также должны указать количество каналов, используйтеCV_32FCx, Если вам нужна глубина, используйтеCV_32F

CV_32F определяется как:

 #define CV_32F  5

в то время какCV_32FC1 определяется как:

#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)

который оценивает5.

Вы можете проверить это с:

#include <opencv2\opencv.hpp>
#include <iostream>
int main()
{
    std::cout <<  CV_32F << std::endl;
    std::cout <<  CV_32FC1 << std::endl;

    return 0;
}
 sagar suri07 нояб. 2017 г., 20:47
Если ответ решил вашу проблему. Примите это, отметив зеленую галочку.
 mlnthr03 июн. 2016 г., 10:01
Большое спасибо за этот полный ответ, теперь он понятнее :)

Ваш ответ на вопрос