#include <QCoreApplication>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
Mat src,gray,dst;
int Threshold_val=128;
int max_val=255;
const char* output_win="output image";
void FindROI(int,void*)
{
cvtColor(src,gray,COLOR_BGR2GRAY);
Mat canny_output;
//边缘检测
Canny(gray,canny_output,Threshold_val,Threshold_val*2,3,false);
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
//找轮廓
findContours(canny_output,contours,hierachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
int minW=src.cols*0.55;
int minH=src.rows*0.7;
//随机数
RNG rng(12345);
Mat darwImg =Mat::zeros(src.size(),CV_8UC3);
Rect bbox;
for(int i=0;i<contours.size();i++)
{
RotatedRect minRect=minAreaRect(contours[i]);
float degree=abs(minRect.angle);
printf("current angle :%f\n",degree);
if(minRect.size.width >minW && minRect.size.height>minH && minRect.size.width<(src.cols-5))
{
Point2f pts[4];
minRect.points(pts);
bbox=minRect.boundingRect();
Scalar color=Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
for(int j=0;j<4;j++)
{
line(darwImg,pts[j],pts[(j+1)%4],color,2,8,0);
}
}
}
imshow(output_win,darwImg);
if(bbox.width >0 && bbox.height >0)
{
Mat result=src(bbox);
imshow("result",result);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
src=imread("../image/6.png");
if(src.empty())
{
printf("could not load image ...");
return -1;
}
namedWindow("input image",CV_WINDOW_AUTOSIZE);
imshow("input image",src);
namedWindow(output_win,CV_WINDOW_AUTOSIZE);
createTrackbar("threshold",output_win,&Threshold_val,max_val,FindROI);
FindROI(0,0);
waitKey(0);
}
opencv 实现图片切边案例
最新推荐文章于 2023-02-15 17:38:40 发布