[英]Detect Image object from UIImage using OpenCV
我对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(theta==0)
替换条件if(rho==0)
修改代码
但是,还有下一步做什么? 我在后续步骤中有点困惑。
我不完全确定,但你尝试过模板匹配技术吗? 如果您使用c ++编写opencv代码: http : //docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
我希望这有助于找到模板(源图像)和测试图像(屏幕截图)之间的互相关。
在下面的链接中,您将找到有关如何应用和绘制模板匹配的完整示例。
希望这可以帮助。
干杯。
垂发。
如果您知道图像始终位于第二条水平线和第三条水平线之间,则会执行以下操作:
我完全同意下面的帖子,这是最好的解决方案,但遗憾的是,我认为@Mrug开发将针对智能手机设备,并且canny边缘检测和hough line变换在这些平台上的计算成本非常高。
也许你可以使用Sobel衍生物来设计水平和垂直衍生物。
这些链接可以帮助您:
Sobel Derivates http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html
Canny边缘探测器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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.