OpenCVとPythonをつかってプロトタイピングをしてみました。与えられた画像に対してはそれっぽく検知できます。C++への移植はがんばってください。
Python
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3import cv2
4import numpy as np
5
6img = cv2.imread('input.jpg')
7
8# 2値化
9tmp = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
10_, tmp = cv2.threshold(tmp, 16, 255, cv2.THRESH_BINARY)
11
12# 8近傍カーネルによるノイズ除去
13neibor8 = np.ones((3,3), np.uint8)
14tmp = cv2.morphologyEx(tmp, cv2.MORPH_OPEN, neibor8, iterations=3)
15tmp = cv2.morphologyEx(tmp, cv2.MORPH_CLOSE, neibor8, iterations=3)
16
17# 輪郭抽出
18_, contours, _ = cv2.findContours(tmp, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
19contours.sort(key=cv2.contourArea, reverse=True)
20
21# 外枠描画
22# cv2.drawContours(img, contours, 0, (255, 255, 255), 3)
23
24# "カメラ"を楕円近似
25obj_camera = cv2.fitEllipse(contours[1])
26cv2.ellipse(img, obj_camera, (255, 0, 0), 3)
27
28# "フラッシュ"を矩形近似
29obj_flash = cv2.minAreaRect(contours[2])
30obj_flash = np.int0(cv2.boxPoints(obj_flash))
31cv2.drawContours(img, [obj_flash], 0, (0,0,255), 3)
結果画像(青枠="カメラ"、赤枠="フラッシュ"):