資源簡介
###對該程序做如下說明:
* 采用的是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?>?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? 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
評論
共有 條評論