我对OpenCV来说是全新的,但在谷歌搜索期间,我开始了解对象检测&边缘检测。但是,仍然无法找到从ScreenShot检测图像的正确方法。
例如,如果我像下面一样传递带有照片的图像,那么我需要从源图像中提取该照片。
修改 按照@Amitay Nachmani的回答后,我尝试将以下代码实施到第4步。
-(UIImage*)processImage:(UIImage*)sourceImage{
cv::Mat processMat;
UIImageToMat(sourceImage, processMat);
cv::Mat grayImage;
cvtColor(processMat, grayImage, CV_BGR2GRAY);
cv::Mat cannyImage;
cv::Canny(grayImage, cannyImage, 0, 50);
cv::Vec2f lines2;
std::vector<cv::Vec2f> lines;
cv::HoughLines(cannyImage, lines, 1, CV_PI/180, 300);
size_t sizeOfLine = lines.size();
for(size_t i=0;i<sizeOfLine;i++){
float rho = lines[i][0], theta = lines[i][1];
if(rho==0){
cv::Point pt1,pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
cv::line(cannyImage, pt1, pt2, cv::Scalar(255,0,0),2.0);
}
}
UIImage *result = MatToUIImage(cannyImage);
return result;
}
编辑2
我通过替换条件修改了代码
if(rho==0)
与if(theta==0)
但是,还有下一步做什么?我对下一步有点困惑。
答案 0 :(得分:2)
我不完全确定,但是你尝试过模板匹配技术吗? 如果您使用c ++编写opencv代码: http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
我希望这有助于找到模板(源图像)和测试图像(屏幕截图)之间的互相关。
在下面的链接中,您将找到有关如何应用和绘制模板匹配的完整示例。
希望这会有所帮助。
干杯。
垂发。
答案 1 :(得分:2)
如果您知道图像始终位于第二条水平线和第三条水平线之间,则会执行以下操作:
答案 2 :(得分:2)
我完全同意下面的帖子,这是最好的解决方案,但遗憾的是,我认为@Mrug开发将针对智能手机设备,并且精确边缘检测和hough line变换在这些平台上的计算成本非常高。
可能您可以使用旨在计算水平和垂直衍生物的Sobel衍生物。
这些链接可以帮助您:
索贝尔衍生品 http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.htmlCanny边缘探测器 http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html
霍夫变换:
http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html