资源简介
###对该程序做如下说明:
* 采用的是opencv3.X版本
* 针对不同的图片,需要自己手动修改阈值`g_threshVal, g_threshMax`
* 程序是根据[`这一篇博客`](https://blog.csdn.net/rrrfff/article/details/77340641#commentBox)写的,只是自己调通了以后,给大家也分享下
* 因为是自动找点,所以在设置的不太合理的情况下,会出现很奇怪的现象,后果不堪设想。

代码片段和文件信息
#include
using namespace cv;
#define CV_SHOW(x) imshow(“df“x);waitKey(0)
static void testImageRectification(cv::Mat &I);
void main()
{
Mat I;
//I = imread(“D:\\test.bmp“);
I = imread(“E:\\vs2015Project\\testDeDis\\待矫正的图片.png“);
testImageRectification(I);
}
static void testImageRectification(cv::Mat &image_original)
{
CV_SHOW(image_original); // CV_SHOW是cv::imshow的一个自定义宏,忽略即可
cv::Mat &&image = image_original.clone();
cv::Mat image_gray;
cv::cvtColor(image image_gray cv::COLOR_BGR2GRAY);
//cv::threshold(image_gray image_gray g_threshVal g_threshMax cv::THRESH_BINARY);
cv::threshold(image_gray image_gray 110 250 cv::THRESH_BINARY);
std::vector< std::vector > contours_list;
{
std::vector hierarchy;
// Since opencv 3.2 source image is not modified by this function
cv::findContours(image_gray contours_list hierarchy
cv::RetrievalModes::RETR_EXTERNAL cv::ContourApproximationModes::CHAIN_APPROX_NONE);
}
for (uint32_t index = 0; index < contours_list.size(); ++index) {
cv::RotatedRect &&rect = cv::minAreaRect(contours_list[index]);
if (rect.size.area() > 1000) {
if (rect.angle != 0.) {
// 此处可通过cv::warpAffine进行旋转矫正,本例不需要
} //if
cv::Mat &mask = image_gray;
cv::drawContours(mask contours_list static_cast(index) cv::Scalar(255) cv::FILLED);
cv::Mat extracted(image_gray.rows image_gray.cols CV_8UC1 cv::Scalar(0));
image.copyTo(extracted mask);
CV_SHOW(extracted);
std::vector poly;
cv::approxPolyDP(contours_list[index] poly 30 true); // 多边形逼近,精度(即最小边长)设为30是为了得到4个角点
cv::Point2f pts_src[] = { // 此处顺序调整是为了和后面配对,仅作为示例
poly[1]
poly[0]
poly[3]
poly[2]
};
cv::Rect &&r = rect.boundingRect(); // 注意坐标可能超出图像范围
cv::Point2f pts_dst[] = {
cv::Point(r.x r.y)
cv::Point(r.x + r.width r.y)
cv::Point(r.x + r.width r.y + r.height)
cv::Point(r.x r.y + r.height)
};
cv::Mat &&M = cv::getPerspectiveTransform(pts_dst pts_src); // 我这里交换了输入,因为后面指定了cv::WARP_INVERSE_MAP,你可以试试不交换的效果是什么
cv::Mat warp; cv::warpPerspective(image warp M image.size() cv::INTER_LINEAR + cv::WARP_INVERSE_MAP cv::BORDER_REPLICATE);
CV_SHOW(warp);
} //if
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2437 2018-07-03 15:49 main.cpp
文件 312 2018-07-03 16:16 readMe.md
文件 220677 2018-07-03 15:43 待矫正的图片.png
- 上一篇:4*4矩阵键盘(方法2) STM32F103
- 下一篇:我爱背单词8.txt
相关资源
- 基于OpenCV的数字识别468815
- 使用opencv去掉二值化图像中黑色面积
- opencv环境配置
- win10 64位下编译的opencv4.5.5库,opencv
- NVIDIAOpticalFlowSDK-79c6cee80a2df9a196f20afd6
- opencv_contrib-3.4.0.zip
- opencv2.4.9源码分析——SIFT
- 用两个摄像头实现,双目标定,双目
- opencv_traincascade训练分类器,手势识别
- opencv3.0交叉编译用parallel.cpp
- 基于opencv的图像识别识别图像中的色
- 基于openCV的识别特定颜色区域
- 基于OpenCV的分水岭算法实现
- QT+opencv+OCR 身份证号码,银行卡号识别
- opencv视频特定颜色区域识别
- 把RGB转换为HSV和HSI然后根据黄色和蓝
- opencv视觉测距
- 基于Qt和opencv的身份证号码识别系统
- opencv_ffmpeg249.dll
- SfM稀疏三维点云重建--完整工程文件
- 基于opencv的数人头程序源代码
- 利用OpenCV中的Stitcher类实现全景图像拼
- opencv实现的sift算法源码,包含了图像
- openCV 上的小波变换
- 基于OPENCV的车牌识别系统设计
- 617张国内车牌60-17bmp图片用于OpenCV正样
- hog特征提取,c版本代码
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- 基于Opencv实现的图像纠偏
- ImageWatch2019.vsix
评论
共有 条评论