OpenCV学习笔记之扫描图像
生活随笔
收集整理的這篇文章主要介紹了
OpenCV学习笔记之扫描图像
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、?圖像在內存中存儲方式
圖像矩陣的大小取決于我們所用的顏色模型,確切地說,取決于所用通道數。如果是灰度圖像,矩陣就會像這樣:
而對多通道圖像來說,矩陣中的列會包含多個子列,其子列個數與通道數相等。例如,RGB顏色模型的矩陣:
注意到,子列的通道順序是反過來的:BGR而不是RGB。很多情況下,因為內存足夠大,可實現連續存儲,因此,圖像中的各行就能一行一行地連接起來,形成一個長行。連續存儲有助于提升圖像掃描速度,我們可以使用?isContinuous()?來去判斷矩陣是否是連續存儲的. 相關示例會在接下來的內容中提供。
二、掃描圖像幾種方式
2.1 指針訪問
/*!* \brief scanImagePtr* \param image* \return*/ Mat& scanImagePtr(Mat &image){double start = static_cast<double>(getTickCount());//! 行int rowNumber = image.rows;//! 每一行元素個數 = 列數 x 通道數int colNumber = image.cols * image.channels();for (int i = 0; i < rowNumber; i++){//! 獲取第i行的首地址uchar* data = image.ptr<uchar>(i);for (int j = 0; j < colNumber; j++){data[j] /= 2;}}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();cout << "type1:" << time << "s" << endl;return image; }2.2?迭代器iterator
/*!* \brief scanImageiterator* \param image* \return*/ Mat& scanImageiterator(Mat &image){double start = static_cast<double>(getTickCount());//! 初始位置的迭代器Mat_<Vec3b>::iterator it = image.begin<Vec3b>();//! 終止位置的迭代器Mat_<Vec3b>::iterator itend = image.end<Vec3b>();for (; it != itend; it++){//! 處理BGR三個通道(*it)[0] = 255;//B//(*it)[1] = 255;//G//(*it)[2] = 0;//R}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();//計算時間cout << "type2:" << time << "s" << endl;return image; }2.3?動態地址計算
/*!* \brief scanImageAt* \param image* \return*/ Mat& scanImageAt(Mat &image){double start = static_cast<double>(getTickCount());int rowNumber = image.rows;int colNumber = image.cols;for (int i = 0; i < rowNumber; i++)for (int j = 0; j < colNumber; j++){//! 處理BGR三個通道//image.at<Vec3b>(i, j)[0] = 0;//Bimage.at<Vec3b>(i, j)[1] = 255;//G//image.at<Vec3b>(i, j)[2] = 0;//R}double end = static_cast<double>(getTickCount());double time = (end - start) / getTickFrequency();//計算時間cout << "type3:" << time << "s" << endl;return image; }2.4 三種方法效能對比
type1:0.000189559s type2:0.000832323s type3:0.000424337s?經典的C風格運算符[](指針)訪問要更勝一籌。
代碼詳見《OpenCV掃描圖像三種方式練習》
三、OpenCv坐標系
OpenCV中坐標體系中的零點坐標定義為圖片的左上角,X軸為圖像矩形的上面那條水平線,從左往右;Y軸為圖像矩形左邊的那條垂直線,從上往下。在Point(x,y)和Rect(x,y)中,第一個參數x代表的是元素所在圖像的列數,第二個參數y代表的是元素所在圖像的行數,而在at(x,y)中是相反的。
參考資料:
- ?OpenCV坐標系與操作像素的四種方法
- OpenCV如何掃描圖像、利用查找表和計時
- Opencv中三種操作像素的方法
總結
以上是生活随笔為你收集整理的OpenCV学习笔记之扫描图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记之Mat
- 下一篇: OpenCV学习笔记之掩码操作