久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

OpenCV坐標(biāo)體系+minMaxLoc的使用細(xì)節(jié) | 學(xué)步園

 Y忍冬草 2016-09-30

 前言

  相信很多朋友在使用OpenCV的時(shí)候會(huì)遇到一個(gè)小問題,且有時(shí)候?qū)@樣的小問題沒有引起足夠的重視,,或者通過表面想當(dāng)然的去編程,,所以調(diào)試代碼時(shí)出現(xiàn)一些莫名其妙的問題,,最后發(fā)現(xiàn)問題時(shí)時(shí)間已經(jīng)過去了一大把。最近我在調(diào)試一個(gè)項(xiàng)目時(shí)就遇到過這種情況,,即Mat::at(x,y)和Mat::at(Point(x, y))的區(qū)別,,我在項(xiàng)目中把這2種看成效果一樣的,結(jié)果這個(gè)問題調(diào)試時(shí)糾結(jié)了2天(因?yàn)樵摴こ逃嘘P(guān)OpenCV的代碼有上千行,,且沒有懷疑這兩者的區(qū)別,,因此有時(shí)候出現(xiàn)一些莫名其妙的結(jié)果,花了很多時(shí)間才找問題所在),。其實(shí)關(guān)于Mat的at訪問時(shí)這2者的區(qū)別我以前也做過筆記,,只是此時(shí)不小心忘記了。這次專門為這個(gè)寫篇小筆記,,提醒下自己,。

  開發(fā)環(huán)境:OpenCV2.4.3+QtCreator2.5.1

 

  實(shí)驗(yàn)基礎(chǔ)

  本次實(shí)驗(yàn)通過一個(gè)簡短的例子,主要來說明下面4個(gè)問題:

  1. 坐標(biāo)體系中的零點(diǎn)坐標(biāo)為圖片的左上角,,X軸為圖像矩形的上面那條水平線,;Y軸為圖像矩形左邊的那條垂直線。該坐標(biāo)體系在諸如結(jié)構(gòu)體Mat,Rect,Point中都是適用的,。(雖然網(wǎng)上有學(xué)著說OpenCV中有些數(shù)據(jù)結(jié)構(gòu)的坐標(biāo)原點(diǎn)是在圖片的左下角,,但是我暫時(shí)還沒碰到過)。

  2. 在使用image.at<TP>(x1, x2)來訪問圖像中點(diǎn)的值的時(shí)候,,x1并不是圖片中對(duì)應(yīng)點(diǎn)的x軸坐標(biāo),,而是圖片中對(duì)應(yīng)點(diǎn)的y坐標(biāo)。因此其訪問的結(jié)果其實(shí)是訪問image圖像中的Point(x2, x1)點(diǎn),,即與image.at<TP>(Point(x2, x1))效果相同,。

  3. 如果所畫圖像是多通道的,比如說image圖像的通道數(shù)時(shí)n,,則使用Mat::at(x, y)時(shí),,其x的范圍依舊是0到image的height,而y的取值范圍則是0到image的width乘以n,,因?yàn)檫@個(gè)時(shí)候是有n個(gè)通道,,所以每個(gè)像素需要占有n列。但是如果在同樣的情況下,,使用Mat::at(point)來訪問的話,,則這時(shí)候可以不用考慮通道的個(gè)數(shù),因?yàn)槟阋x值給獲取Mat::at(point)的值時(shí),,都不是一個(gè)數(shù)字,,而是一個(gè)對(duì)應(yīng)的n維向量。

  4. 多通道圖像在使用minMaxLoc()函數(shù)是不能給出其最大最小值坐標(biāo)的,因?yàn)槊總€(gè)像素點(diǎn)其實(shí)有多個(gè)坐標(biāo),,所以是不會(huì)給出的。因此在編程時(shí),,這2個(gè)位置應(yīng)該給NULL,。

 

  實(shí)驗(yàn)代碼及注釋

  main.cpp:

復(fù)制代碼
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat image, image_3c;
    image.create(Size(256, 256), CV_8UC1);
    image_3c.create(Size(256, 256), CV_8UC3);   //3通道的圖像
    image.setTo(0);
    image_3c.setTo(0);

    image.at<uchar>(10, 200) = 255; //使用at函數(shù)的地方,用的是10,200
    Point point(20, 100);
    image.at<uchar>(point) = 250;//使用at函數(shù)的地方,,用的是Point(10,200)

    image_3c.at<uchar>(10, 300) = 255;
    image_3c.at<uchar>(10, 302) = 254;
    Point point_3c(20, 200);
    image_3c.at<uchar>(point_3c) = 250;

    double maxVal = 0; //最大值一定要賦初值,,否則運(yùn)行時(shí)會(huì)報(bào)錯(cuò)
    Point maxLoc;
    minMaxLoc(image, NULL, &maxVal, NULL, &maxLoc);
    cout << "單通道圖像最大值: " << maxVal << endl;
    double min_3c, max_3c;
    //注意多通道在使用minMaxLoc()函數(shù)是不能給出其最大最小值坐標(biāo)的,因?yàn)槊總€(gè)像素點(diǎn)其實(shí)有多個(gè)坐標(biāo),,所以是不會(huì)給出的
    minMaxLoc(image_3c, &min_3c, &max_3c, NULL, NULL);
    cout << "3通道圖像最大值: " << max_3c << endl;

    imshow("image", image);
    imshow("image_3c", image_3c);
    waitKey(0);
    return 0;
}
復(fù)制代碼

 

  實(shí)驗(yàn)結(jié)果:

  單通道圖像的輸出結(jié)果如下所示:

  

  由上圖可以看出,,黑色的圖像中有2個(gè)白色的點(diǎn)(讀者可以仔細(xì)看下,由于只有1個(gè)像素點(diǎn),,所以需要自己找下,,呵呵)的位置是不同的,因此可以證明Mat::at(x,y)和Mat::at(Point(x, y))是有區(qū)別的,。

 

  3通道圖像的輸出結(jié)果如下所示:

  

  由上圖可以看出,,3通道的圖像也是有2個(gè)點(diǎn)的,但是程序中在使用Mat::at(x, y)其y的值為300和302,,這已經(jīng)超出了圖像的寬度256,。這同時(shí)證明了實(shí)驗(yàn)基礎(chǔ)中的第3點(diǎn)。

 

  后臺(tái)輸出結(jié)果如下:

  

 

  實(shí)驗(yàn)總結(jié):由此可見,,平時(shí)一定要注意一些細(xì)節(jié)上的東西,。

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多