1. 程式人生 > 其它 >使用OpenCV對影象進行切邊

使用OpenCV對影象進行切邊

一、概述

  案例:使用OpenCV對旋轉圖片及正常圖片進行切邊。

  A:對正常圖片切邊的步驟

    1.載入影象

    2.對影象進行灰度化

    3.邊緣檢測

    4.輪廓發現

    5.找出符合目標的最大外接矩形,並使用矩形的四個座標點繪製線

    6.根據找到Rect在原圖上切除ROI區域

    7.顯示ROI區域

  B:對旋轉影象切邊的步驟

    1.載入原圖

    2.對影象進行灰度化

    3.邊緣檢測

    4.輪廓發現

    5.找出影象旋轉角度(a.找出旋轉矩形的最大寬和最大高 b.找出這個目標矩形的旋轉角度及旋轉矩形。c.把此矩形繪製出來)

    6.根據圖片中心點及旋轉角度,利用getRotationMatrix2D製作目標旋轉Mat

    7.利用wrapAffine+第6步的旋轉矩陣實現最終的旋轉

    8.此時的圖片為正確的旋轉圖片,可以利用“A:對正常圖片切邊”的步驟來實現圖片的切邊  

二、程式碼示例

/*將旋轉圖片轉成正常圖片*/
void
CaseOneEdgeCutting::correctImageAngle(Mat & target){ src = imread(filePath.toStdString().c_str()); if(src.empty()){ qDebug()<<"載入圖片異常"; return; } imshow(
"src",src); //降噪 cvtColor(src,gray,COLOR_BGR2GRAY); imshow("gray",gray); //邊緣檢測 Canny(gray,gray,threshold_value,threshold_value*2); imshow("canny",gray); //輪廓發現 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(gray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE); Mat resultImage
= Mat::zeros(src.size(),CV_8UC3); float width = 0; float height = 0; RNG rng(12345); float degree = 0; for(size_t t =0;t<contours.size();t++){//找到角度 RotatedRect minRect = minAreaRect(contours[t]); degree = abs(minRect.angle); if(degree>0){ width = max(width,minRect.size.width); height = max(height,minRect.size.height); } } for(size_t t = 0;t<contours.size();t++){ RotatedRect minRect = minAreaRect(contours[t]); if (width == minRect.size.width && height == minRect.size.height) { degree = minRect.angle; qDebug()<<"degree:"<<degree; Point2f pts[4]; minRect.points(pts); Scalar color = Scalar(0,0,255); for(int i=0;i<4;i++){ line(resultImage,pts[i], pts[(i + 1)%4], color, 2, 8, 0); } } } imshow("result1",resultImage); Point2f center(src.cols/2,src.rows/2);//圖片中心點 Mat degreeRoi = getRotationMatrix2D(center,-degree,1); warpAffine(src,target,degreeRoi,src.size(),INTER_LINEAR, 0, Scalar(255, 255, 255)); imshow("dst",target); } /*正常圖片找到ROI區域*/ void CaseOneEdgeCutting::findEdgeCuttingROIImage(Mat &target){ Mat srcTarget = target.clone(); //降噪 cvtColor(target,target,COLOR_BGR2GRAY); //邊緣檢測 Canny(target,target,threshold_value,threshold_value*2); imshow("target",target); //輪廓發現 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(target,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE); Mat resultImage = Mat::zeros(src.size(),CV_8UC3); float width = target.cols*0.5; float height = target.rows*0.5; RNG rng(12345); Rect box; for(size_t t = 0;t<contours.size();t++){ RotatedRect minRect = minAreaRect(contours[t]); if(minRect.size.width>width&&minRect.size.height>height&&minRect.size.width<(src.cols-60)){ qDebug()<<"執行到了這裡"; Point2f pts[4]; minRect.points(pts); box = minRect.boundingRect(); Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)); for(int i=0;i<4;i++){ line(resultImage,pts[i], pts[(i + 1)%4], color, 2, 8, 0); } } } imshow("result2",resultImage); // //繪製roi區域 Mat roiImage = srcTarget(box); imshow("roiImage",roiImage); }

 

 

三、圖片示例