• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-04
  • 语言: C/C++
  • 标签: OpenCV  

资源简介

OpenCV根据轮廓进行倾斜校正。算法参考可以参考我的文章。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include   
#include 
#include 
using namespace std;
using namespace cv;
double angleOfLines(const cv::Vec4i& line1 const cv::Vec4i& line2);
void rotateIamge(cv::Mat& src cv::Mat& dst double angle);
double angleForCorrect(const cv::Vec4i& line);
bool getMinMidX(const cv::Vec4i& line1 const cv::Vec4i& line2);
bool getMaxMidX(const cv::Vec4i& line1 const cv::Vec4i& line2);
bool getMinMidY(const cv::Vec4i& line1 const cv::Vec4i& line2);
bool getMaxMidY(const cv::Vec4i& line1 const cv::Vec4i& line2);
double angle;
double angleOfLines(const cv::Vec4i& line1 const cv::Vec4i& line2)
{
double moduleLine1 = sqrt(pow(line1[0] - line1[2] 2) + pow(line1[1] - line1[3] 2));
double moduleLine2 = sqrt(pow(line2[0] - line2[2] 2) + pow(line2[1] - line2[3] 2));
double dotProduct = (line1[2] - line1[0])*(line2[2] - line2[0]) + (line1[3] - line1[1])*(line2[3] - line2[1]);

return acos(dotProduct / moduleLine1 / moduleLine2) * 180 / CV_PI;
}
double angleForCorrect(const cv::Vec4i& line)
{
Vec4i unitXVector(0 0 1 0);
angle = angleOfLines(unitXVector line);  // here angle belongs to [0 pi/2]
  // @attention: the increment direction of X and Y axis of OpenCV is different from usual rectangular coordinate system. The origin point is in the upper left corner of the image
if (angle < 45)
{
// consider in the horizontal direction
if (line[1] > line[3])
{
angle = -angle;
}
}
else
{
// consider in the vertical direction
if (line[1] > line[3])
{
angle = 90 - angle;
}
else
{
angle = angle - 90;
}
}
cout << “angle = “ << angle << endl;
return angle;
}
bool getMinMidX(const cv::Vec4i& line1 const cv::Vec4i& line2)
{
return (line1[0] + line1[2]) < (line2[0] + line2[2]); // Although middle point compared there is no need to divide 2
}
bool getMaxMidX(const cv::Vec4i& line1 const cv::Vec4i& line2)
{
return (line1[0] + line1[2]) > (line2[0] + line2[2]);
}

/**
* @brief comparison function for sort sort vector from small to large accodoring to y of the midpoint of each element
* @param line1
* @param line2
* @return
*/
bool getMinMidY(const cv::Vec4i& line1 const cv::Vec4i& line2)
{
return (line1[1] + line1[3]) < (line2[1] + line2[3]);
}

/**
* @brief comparison function for sort sort vector from large to small accodoring to y of the midpoint of each element
* @param line1
* @param line2
* @return
*/
bool getMaxMidY(const cv::Vec4i& line1 const cv::Vec4i& line2)
{
return (line1[1] + line1[3]) > (line2[1] + line2[3]);
}

void rotateIamge(cv::Mat& src cv::Mat& dst double angle)
{
cv::Point2f center(src.cols / 2 src.rows / 2);
cv::Mat rot = getRotationMatrix2D(center angle 1);
cv::Rect box = RotatedRect(center src.size() angle).boundingRect(

评论

共有 条评论