OpenCV識別圖像上的線條軌跡
如果圖片上有線條,圖形什么的,人的眼睛可以直接看出來,這是人的直接反應(yīng)。那么如何讓電腦識別呢?
圖片在內(nèi)存中是以二維矩陣的形式存儲的,如果是彩圖,則是GBR三通道,灰度圖則是單通道。本教程用OpenCV去識別圖形上的線條,曲線等軌跡。
軟件環(huán)境:Win7-32, VS2010, OpenCV2.4.9
(1)以灰度圖的方式導(dǎo)入圖片
Mat src = imread("1.jpg", 0);
(2)我的思路:根據(jù)圖形中的每個像素點的差異去判斷,對原圖的灰度圖做二值化處理,不是線條的區(qū)域像素置0,有線條的區(qū)域置為255,然后逐列進行像素求和,如果列的和大于0則是檢測到了線條,此時結(jié)束該列的掃描,繼續(xù)掃描下一列。這樣就可以得到線條的軌跡了。
二值處理:
threshold(src, dst, 100, 255, CV_THRESH_BINARY_INV); //二值化
按列掃描求和:
//按列掃描,求像素和,由于是二值后的圖片,沒有線條時,該列的像素和為0;掃描到線條時像素大于0
for(int w = 0; w < nCols; w++)
{
int sum = 0;
for(int h = 0; h < nRows; h++)
{
uchar *pRow = dst.ptr<uchar>(h, w); //該列中每個像素的地址
sum += (int)(*pRow);
if(sum > 0) //到達了線條的上側(cè),像素和大于0
{
cout << "找到了線條點,"; //從上往下找,由于線條很細,目前只判斷上邊界。
cout << "坐標如下: X = " << w << ", Y = " << h << endl;
fout << "坐標如下: X = " << w << ", Y = " << h << endl; //控制臺會丟失數(shù)據(jù),存到文本不會丟失
sum = 0;
break;
}
}
}
整體代碼如下:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <fstream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("1.jpg", 0);
//imshow("src", src);
Mat dst;
threshold(src, dst, 100, 255, CV_THRESH_BINARY_INV); //二值化
//imshow("dst", dst);
int nRows = dst.rows;
int nCols = dst.cols;
ofstream fout("data.txt");
//按列掃描,求像素和,由于是二值后的圖片,沒有線條時,該列的像素和為0;掃描到線條時像素大于0
for(int w = 0; w < nCols; w++)
{
int sum = 0;
for(int h = 0; h < nRows; h++)
{
uchar *pRow = dst.ptr<uchar>(h, w); //該列中每個像素的地址
sum += (int)(*pRow);
if(sum > 0) //到達了線條的上側(cè),像素和大于0
{
cout << "找到了線條點,"; //從上往下找,由于線條很細,目前只判斷上邊界。
cout << "坐標如下: X = " << w << ", Y = " << h << endl;
fout << "坐標如下: X = " << w << ", Y = " << h << endl; //控制臺會丟失數(shù)據(jù),存到文本不會丟失
sum = 0;
break;
}
}
}
waitKey();
cout << endl;
system("pause");
return 0;
}
在Qt中進行模擬,得到的如下結(jié)果:

目前的識別如上所示,后續(xù)會繼續(xù)更新,如有好的處理方法,請各位博友斧正。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入探討:main函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼?
本篇文章是對main函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,進行了詳細的分析介紹,需要的朋友參考下2013-05-05
利用C語言實現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換
這篇文章主要為大家詳細介紹了2個函數(shù),分別是sprintf和sscanf,可以用來實現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03
C++學習小結(jié)之數(shù)據(jù)類型及轉(zhuǎn)換方式
本文給大家分享的是本人在學習C++過程中的一個小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請直接飄過。2015-07-07

