opencv檢測直線方法之投影法
本文實(shí)例為大家分享了opencv檢測直線之投影法的具體代碼,供大家參考,具體內(nèi)容如下
以下是我對投影法的一點(diǎn)認(rèn)識和實(shí)驗(yàn):
投影法就是數(shù)字圖像在某個(gè)方向上進(jìn)行像素累加。通過水平和垂直方向的投影,可以得到表格圖像投影的幾個(gè)特點(diǎn):
(1)表格區(qū)域的水平與豎直投影分布通常出現(xiàn)周期性的尖峰
(2)在文字投影的行與行之間或列與列之間常會出現(xiàn)明顯的空白區(qū)
因此,求圖像水平以及豎直投影,根據(jù)特點(diǎn)分別設(shè)以閾值就可以將橫線以及豎直線所在位置確定。
第一步:求圖像的水平投影、豎直投影
第二步:設(shè)定合理閾值,求取大于閾值的坐標(biāo)(水平投影記錄縱坐標(biāo),垂直投影記錄橫坐標(biāo))
第三步:根據(jù)記錄縱坐標(biāo)恢復(fù)水平線,根據(jù)記錄橫坐標(biāo)恢復(fù)豎直線。
下面附整體代碼以及實(shí)驗(yàn)結(jié)果:
#include<iostream>
#include<vector>
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
Mat VerticalLine(Mat srcImageBin)//垂直線條檢測
{
vector <int> array;//動態(tài)數(shù)組用來存儲投影值大于閾值的橫坐標(biāo)
int *colswidth = new int[srcImageBin.cols]; //申請src.image.cols個(gè)int型的內(nèi)存空間,存儲二值圖中每列的白色像素?cái)?shù)
memset(colswidth, 0, srcImageBin.cols * 4); //數(shù)組必須賦初值為零,否則出錯(cuò)。無法遍歷數(shù)組。
int value;
for (int i = 0; i < srcImageBin.cols; i++)
{
for (int j = 0; j < srcImageBin.rows; j++)
{
value = srcImageBin.at<uchar>(j, i);
if (value == 255)
{
colswidth[i]++; //統(tǒng)計(jì)每列的白色像素點(diǎn)
}
}
}
Mat lineImage(srcImageBin.rows, srcImageBin.cols, CV_8UC1, cv::Scalar(0, 0, 0));
//尋找投影大于閾值0.3*srcImageBin.rows的橫坐標(biāo)
for (int i = 0; i < srcImageBin.cols; i++)
{
bool flag = true;
for (int j = 0; j < colswidth[i] && colswidth[i] >= (0.3*srcImageBin.rows); j++)
{
if (flag == true)
{
array.push_back(i);
flag = false;
}
}
}
int count = array.size();
//恢復(fù)直線
for (int n = 0; n < srcImageBin.rows; n++)
{
for (int w = 0; w<count; w++)
{
if (srcImageBin.at<uchar>(n, array[w]) == 255)
{
lineImage.at<uchar>(n, array[w]) = 255;
}
}
}
delete[] colswidth;
return lineImage;
}
Mat HorizonLine(Mat srcImageBin)//水平線條檢測
{
vector <int> array1;
int *rowswidth = new int[srcImageBin.rows];
memset(rowswidth, 0, srcImageBin.rows * 4);
int value;
for (int i = 0; i < srcImageBin.rows; i++)
{
for (int j = 0; j < srcImageBin.cols; j++)
{
value = srcImageBin.at<uchar>(i, j);
if (value == 255)
{
rowswidth[i]++; //統(tǒng)計(jì)每行的白色像素點(diǎn)
}
}
}
Mat lineImage(srcImageBin.rows, srcImageBin.cols, CV_8UC1, cv::Scalar(0, 0, 0));
//尋找投影大于閾值0.525*srcImageBin.cols的縱坐標(biāo)
for (int i = 0; i < srcImageBin.rows; i++)
{
bool flag = true;
for (int j = 0; j < rowswidth[i] && rowswidth[i] >= (0.525*srcImageBin.cols); j++)
{
if (flag == true)
{
array1.push_back(i);
flag = false;
}
}
}
int count = array1.size();
//恢復(fù)水平線
for (int h = 0; h<count; h++)
{
for (int m = 0; m < srcImageBin.cols; m++)
{
if (srcImageBin.at<uchar>(array1[h], m) == 255)
{
lineImage.at<uchar>(array1[h], m) = 255;
}
}
}
delete[] rowswidth;//釋放前面申請的空間
return lineImage;
}
int main()
{
Mat srcImage = imread("E:\\x.jpg");
Mat closeimage;
imshow("原圖", srcImage);
if (srcImage.channels() > 1)
cvtColor(srcImage, srcImage, CV_RGB2GRAY);
Mat srcImageBin;
threshold(srcImage, srcImageBin, 140, 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);
Mat VP;
VP = VerticalLine(srcImageBin);
Mat HP;
HP = HorizonLine(srcImageBin);
Mat mergelineImage;
bitwise_or(HP, VP, mergelineImage);
imshow("mergelineImage", mergelineImage);
waitKey(0);
return 0;
}
實(shí)驗(yàn)結(jié)果如下:
由上結(jié)果可知,如果直線中間有字會被誤檢為直線,圖中用紅色橢圓標(biāo)出。
文中若有錯(cuò)誤的不妥的地方,還望指出,以便共同學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測
欄 目:C語言
本文標(biāo)題:opencv檢測直線方法之投影法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/556.html
您可能感興趣的文章
- 01-10Unix下C程序內(nèi)存泄漏檢測工具Valgrind的安裝與使用詳解
- 01-10C語言中的內(nèi)存泄露 怎樣避免與檢測
- 01-10C++內(nèi)存泄漏及檢測工具詳解
- 01-10使用dc畫筆畫矩形、直線與橢圓示例
- 01-10實(shí)現(xiàn)opencv圖像裁剪分屏顯示示例
- 01-10使用opencv拉伸圖像擴(kuò)大分辨率示例
- 01-10C++程序檢測內(nèi)存泄漏的方法分享
- 01-10基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
- 01-10for循環(huán)中刪除map中的元素valgrind檢測提示error:Invalid read of size
- 01-10淺談CMake配置OpenCV 時(shí)靜態(tài)鏈接與動態(tài)鏈接的選擇


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法


