Вот моя C-оболочка для оператора OpenCV MatExpr "/"
MatExpr* cv_Mat_div_S(Mat* m1, int m2) {
return new MatExpr(*m1 / m2);
}
Я думаю, что я получил эту часть, где я конвертирую фрейм в указатель для использования в cv_Mat_div_S и использую ссылку на него в функции cv_Mat_div_S
Mat mat(frame);
cv_Mat_div_S(&mat, 255);
Но при попытке использовать вывод Cv_Mat_div_S в обычном C++ cvtColor, как показано ниже, я получаю длинную строку ошибок, причем этот вопрос наиболее важен:
error: нет соответствия для 'operator * (тип операнда -' cv :: Mat) cvtColor (* mat, * mat, CV_BGR2Luv);
Вот как я пытаюсь преобразовать обратно в MatExpr:
cvtColor(*mat, *mat, CV_BGR2Luv);
Я попытался использовать & вместо *, но не пошел.
Я мог бы использовать помощь, конвертирующую вывод cv_Mat_div_S
обратно в MatExpr для использования в других функциях C++ для тестирования... И если кто-то может заметить обертку cv_Mat_div_S
и проверить, есть ли лучший способ ее написать, возможно, тот, который может принять более одного типа для параметра значения... но не с использованием шаблона, потому что я компилирую его в.so и его предполагается использовать в extern C {}
Объявление cvtColor() является
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 );
MatExpr может быть неявно преобразован в _InputArray. Но MatExpr не может быть преобразован в _OutputArray неявно. (см. исходный код _InputArray и _OutputArray для более)
Я пробую фрагмент тестового кода:
Mat a0;
MatExpr a(a0);
cvtColor(*(&a), *(&a), COLOR_GRAY2BGR);
VS2012 имеет ошибку компилятора:
error C2664: 'cv::cvtColor' : cannot convert parameter 2 from 'cv::MatExpr' to 'cv::OutputArray '
Поэтому вам нужно указать допустимый OutputArray (например, Mat вместо MatExpr), чтобы сохранить преобразованное изображение Luv.