我完全不了解OpenCV,但在搜索时了解到目标检测和边缘检测。但是,仍然无法找到从屏幕截图中检测图像的正确方法。
例如,如果我传递一个包含照片的图像,如下所示,那么我需要从源图像中提取该照片。
从上面的代码中,我得到了以下生成的图像。
编辑2
我通过将条件
这导致下面的图像:
但是,接下来该怎么做呢? 我在下一步有点困惑。
例如,如果我传递一个包含照片的图像,如下所示,那么我需要从源图像中提取该照片。
编辑 在跟随@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;
}
从上面的代码中,我得到了以下生成的图像。
![输入图像描述](https://istack.dev59.com/Ngyee.webp)
if(rho==0)
替换为if(theta==0)
来修改代码。这导致下面的图像:
![输入图像描述](https://istack.dev59.com/51jdc.webp)