Почти все функции, работающие с Mat's, проверяют размер и тип целевого Mat.Если они одинаковы, они используют их.Таким образом, если вы пороговые значения мата с
threshold(src, src, ...);
, он будет обработан на месте
Но, если коврик назначения имеет другой размер, тип, номерканалов и т. д., он выделит новый.В вашем примере:
tmp.convertTo(tmp, CV_OTHER_TYPE);
теперь вы предполагаете, что dst, который на самом деле является источником tpm, будет изменен:
dst(tmp_region_ofInterest).convertTo(dst(region));
Но он фактически расширяется до
Mat tmp2(tmp.size, CV_OTHER_SIZE);
tmp.convertTo(tmp2,...);
tmp = tmp2;
И после выхода из функции ваш tmp больше не является областью dst.
Причина проста: во-первых, вы не можете изменить тип на месте, и вы не можете изменить тип частичной матрицы.Что ты хочешь случиться?Есть ли матрица (непрерывное пространство в памяти), заполненная смесью unsigned char
и float
?Потому что это произойдет, по крайней мере, в какой-то момент при обработке.
Таким образом, всегда проверяйте в документе, работает ли данная функция на месте, и работает ли она на интересующих регионах, и может ли она работать на интересующих регионах.А также используйте здравый смысл, чтобы заполнить пробелы в официальном документе.