Насколько я понимаю, вы хотите обнаружить улыбку на основе разницы в цвете между зубами и кожей, верно? Возможно, это имеет смысл, поскольку интенсивность пикселей на губах сильно отличается от пикселей на зубах. Если так, то я бы предложил два подхода.
Первый - это вычисление преобразования Лапласа в области лица. Координаты с максимальными значениями лапласиана будут соответствовать наибольшей разнице между интенсивностями соседних пикселей. Я думаю, что улыбка содержит самые контрастные пиксели. Вы должны снова выбрать порог, однако в этом случае он не зависит от освещенности изображения.
Вторая идея аналогична первой, за исключением того, что вам нужно сравнивать пиксели со средним значением всех пикселей лица. Здесь пиксели, значения которых являются относительно высокими относительно среднего значения, рассматриваются как пиксели зубов. Кстати, что-то вроде cvAdaptiveThreshold
может помочь.