资源简介
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(
相关资源
- 人脸识别(opencv_facedetect_v4l2)
- 基于opencv的模板匹配代码
- opencv图片扫描以及校正
- opencv手部轮廓识别以及轨迹识别
- opencv2 3D标定.cpp
- 基于opencv漫水填充算法综合
- opencv激光中心线的提取
- OpenCV Computer Vision Application Programming
- 基于图割的图像分割OpenCV+MFC实现
- 识别魔方颜色
- opencv版俄罗斯方块源码
- VS2013 / MFC + OpenCV 2.4.9实现视频的播放
- 粒子滤波器+目标跟踪的C++实现,VS2
- 张平OpenCV算法精讲基于python和C++教材
- 虹膜识别开源代码OSIRIS4.1基于opencv
- Sift特征点提取与匹配opencv库
- YCbCr、混合高斯以及YCbCg肤色检测模型
- 光流法代码
- OpenCV打开摄像机显示在MFC窗口工程源
- 使用c++读取图像到二维矩阵
- 三维点云的圆柱面拟合
- MFC+OPENCV摄像机标定程序
- 基于特征脸的人脸识别MFC+OpenCV
- opencv图像处理MFC
- OPENCV人脸检测加角点检测并输出坐标
- FillHole.rar
- 道路提取算法 c++ opencv
- PCA代码实现详解
- opencv卡尔曼滤波
- SeamCarving opencv c++
评论
共有 条评论