我目前正在做的是将脸部图像加载到垫子中,设置每只眼睛的中心点X和Y坐标,在每只眼睛周围创建一个圆圈,将ROI设置为眼睛周围的圆圈(使用Rect并设置遮罩),并降低眼睛图像中的红色值。
我的问题是将校正后的眼睛(红色降低)合并到原始图像上,因为校正后的眼睛有黑色遮罩。我不知道如何摆脱黑色面具。
我目前停留在一些OpenCV代码上,这让我明白了这一点:
原始图片:
用黑色面具提取眼睛:
矫正眼睛:
显示我的问题的当前结果:
这是我的帖子的延续:Getting ROI from a Circle/Point
我的理解是你无法创建循环ROI,因此我选择了Rect ROI和黑色面具。正常的Rect不够。
非常感谢任何建议!!谢谢。
答案 0 :(得分:2)
你可以使用蒙面的roi图像进行测试像素,但写入你的真实图像:
cv::Mat plotImage;
int radius = 15;
float threshold = 1.8;
plotImage = cv::imread("C:/temp/debug.jpg", cv::IMREAD_COLOR);
cv::Point leftEye(person.GetLeftEyePoint().X, person.GetLeftEyePoint().Y);
cv::Point rightEye(person.GetRightEyePoint().X, person.GetRightEyePoint().Y);
//get the Rect containing the circle
cv::Rect r(leftEye.x-radius, leftEye.y-radius, radius*2, radius*2);
//obtain the image ROI
cv::Mat roi(plotImage, r);
//make a black mask, same size
cv::Mat mask(roi.size(), roi.type(), cv::Scalar::all(0));
//with a white filled circle in it
cv::circle(mask, cv::Point(radius, radius), radius, cv::Scalar::all(255), -1);
//combine roi & mask
cv::Mat croppedEye = roi&mask;
//conduct red eye detection/removal on croppedEye
int count = 0;
for(int y=0;y<croppedEye.rows;y++)
{
for(int x=0;x<croppedEye.cols;x++)
{
double b = croppedEye.at<cv::Vec3b>(y, x)[0];
double g = croppedEye.at<cv::Vec3b>(y, x)[1];
double r = croppedEye.at<cv::Vec3b>(y, x)[2];
double redIntensity = r / ((g + b) / 2);
//currently causes issues with non-red-eye images
if (redIntensity >= threshold)
{
double newRedValue = (g + b) / 2;
cv::Vec3b pixelColor(newRedValue,g,b);
//
// here's the trick now, just write back to the original image ;)
//
roi.at<cv::Vec3b>(cv::Point(x,y)) = pixelColor;
count++;
}
}
}
cv::imwrite("C:\\temp\\test.jpg", plotImage);
答案 1 :(得分:0)
查看此帖子。 Transparent mask
mylist = dir()
with open('filename.txt','w') as f:
f.write( ','.join( mylist ) )