所以,即时通讯使用opencv捕获文件,扫描并裁剪它。当房间里没有照明时,它完美地工作。当房间里有一些灯光,桌子上有眩光并且文档靠近它时,它也会将眩光视为矩形的一部分。从照片中删除眩光opencv
如何从照片中去除眩光?
下面是一个使用来获得我想要的图像的代码IM:
Mat &image = *(Mat *) matAddrRgba;
Rect bounding_rect;
Mat thr(image.rows, image.cols, CV_8UC1);
cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray
vector<vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
sort(contours.begin(), contours.end(),
compareContourAreas); //Store the index of largest contour
bounding_rect = boundingRect(contours[0]);
rectangle(image, bounding_rect, Scalar(250, 250, 250), 5);
这里讲的是眩光IM的照片:
我发现的东西在inRange中使用,为颜色找到合适的标量,并使用inpaint去除光线。这是一个代码片段,但它总是崩溃,说它需要chanels的8位图像。
Mat &image = *(Mat *) matAddrRgba;
Mat hsv, newImage, inpaintMask;
cv::Mat lower_red_hue_range;
inpaintMask = Mat::zeros(image.size(), CV_8U);
cvtColor(image, hsv, COLOR_BGR2HSV);
cv::inRange(hsv, cv::Scalar(0, 0, 215, 0), cv::Scalar(180, 255, 255, 0),
lower_red_hue_range);
image = lower_red_hue_range;
inpaint(image, lower_red_hue_range, newImage, 3, INPAINT_TELEA);
您可以尝试与服用3-4个快照,从不同的角度,以克服眩光的桌子上的效果。 – ZdaR
如果你没有回答答案,那么你很难知道答案。 –
眩光与镜头眩光消除技术非常相似,并且简单地说,它们添加到RGB色彩空间以使其接近最大值。这可能会很复杂,您可能需要使用空间过滤器来确保尽可能保持背景。对于这样的事物,有一种洋葱皮方法,从3x3矩阵开始,去除额外的眩光成分,并以洋葱皮朝着中心移动。你可以运行它来查看它是否遵循眩光模式并将其删除。 –