日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 智能硬件 > 人工智能AI
[導(dǎo)讀]   opencv中常見(jiàn)的與圖像操作有關(guān)的數(shù)據(jù)容器有Mat,cvMat和IplImage,這三種類型都可以代表和顯示圖像,但是,Mat類型側(cè)重于計(jì)算,數(shù)學(xué)性較高,openCV對(duì)Mat類型的計(jì)算也進(jìn)

  opencv中常見(jiàn)的與圖像操作有關(guān)的數(shù)據(jù)容器有Mat,cvMat和IplImage,這三種類型都可以代表和顯示圖像,但是,Mat類型側(cè)重于計(jì)算,數(shù)學(xué)性較高,openCV對(duì)Mat類型的計(jì)算也進(jìn)行了優(yōu)化。而CvMat和IplImage類型更側(cè)重于“圖像”,opencv對(duì)其中的圖像操作(縮放、單通道提取、圖像閾值操作等)進(jìn)行了優(yōu)化。在opencv2.0之前,opencv是完全用C實(shí)現(xiàn)的,但是,IplImage類型與CvMat類型的關(guān)系類似于面向?qū)ο笾械睦^承關(guān)系。實(shí)際上,CvMat之上還有一個(gè)更抽象的基類----CvArr,這在源代碼中會(huì)常見(jiàn)。

  1. IplImage

  opencv中的圖像信息頭,該結(jié)構(gòu)體定義: typedef struct _IplImage

  {

  int nSize; /* IplImage大小 */

  int ID; /* 版本 (=0)*/

  int nChannels; /* 大多數(shù)OPENCV函數(shù)支持1,2,3 或 4 個(gè)通道 */

  int alphaChannel; /* 被OpenCV忽略 */

  int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,

  IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */

  char colorModel[4]; /* 被OpenCV忽略 */

  char channelSeq[4]; /* 被OpenCV忽略 */

  int dataOrder; /* 0 - 交叉存取顏色通道, 1 - 分開(kāi)的顏色通道。 cvCreateImage只能創(chuàng)建交叉存取圖像 */

  int origin; /* 0 - 頂—左結(jié)構(gòu),1 - 底—左結(jié)構(gòu) (Windows bitmaps 風(fēng)格) */

  int align; /* 圖像行排列 (4 or 8)。 OpenCV 忽略它,使用 widthStep 代替 */

  int width; /* 圖像寬像素?cái)?shù) */

  int height; /* 圖像高像素?cái)?shù)*/

  struct _IplROI *roi; /* 圖像感興趣區(qū)域。 當(dāng)該值非空只對(duì)該區(qū)域進(jìn)行處理 */

  struct _IplImage *maskROI; /* 在 OpenCV中必須置NULL */

  void *imageId; /* 同上*/

  struct _IplTIleInfo *TIleInfo; /*同上*/

  int imageSize; /* 圖像數(shù)據(jù)大?。ㄔ诮徊娲嫒「袷较耰mageSize=image-》height*image-》widthStep),單位字節(jié)*/

  char *imageData; /* 指向排列的圖像數(shù)據(jù) */

  int widthStep; /* 排列的圖像行大小,以字節(jié)為單位 */

  int BorderMode[4]; /* 邊際結(jié)束模式, 被OpenCV忽略 */

  int BorderConst[4]; /* 同上 */

  char *imageDataOrigin; /* 指針指向一個(gè)不同的圖像數(shù)據(jù)結(jié)構(gòu)(不是必須排列的),是為了糾正圖像內(nèi)存分配準(zhǔn)備的 */

  } IplImage;

  dataOrder中的兩個(gè)取值:交叉存取顏色通道是顏色數(shù)據(jù)排列將會(huì)是BGRBGR.。.的交錯(cuò)排列。分開(kāi)的顏色通道是有幾個(gè)顏色通道就分幾個(gè)顏色平面存儲(chǔ)。roi是IplROI結(jié)構(gòu)體,該結(jié)構(gòu)體包含了xOffset,yOffset,height,width,coi成員變量,其中xOffset,yOffset是x,y坐標(biāo),coi代表channel of interest(感興趣的通道),非0的時(shí)候才有效。訪問(wèn)圖像中的數(shù)據(jù)元素,分間接存儲(chǔ)和直接存儲(chǔ),當(dāng)圖像元素為浮點(diǎn)型時(shí),(uchar *) 改為 (float *):

  /*間接存取*/

  IplImage* img=cvLoadImage(“lena.jpg”, 1);

  CvScalar s; /*sizeof(s) == img-》nChannels*/

  s=cvGet2D(img,i,j); /*get the (i,j) pixel value*/

  cvSet2D(img,i,j,s); /*set the (i,j) pixel value*/

  /*宏操作*/

  IplImage* img; //malloc memory by cvLoadImage or cvCreateImage

  for(int row = 0; row 《 img-》height; row++)

  {

  for (int col = 0; col 《 img-》width; col++)

  {

  b = CV_IMAGE_ELEM(img, UCHAR, row, col * img-》nChannels + 0);

  g = CV_IMAGE_ELEM(img, UCHAR, row, col * img-》nChannels + 1);

  r = CV_IMAGE_ELEM(img, UCHAR, row, col * img-》nChannels + 2);

  }

  }

  /*直接存取*/

  IplImage* img; //malloc memory by cvLoadImage or cvCreateImage

  uchar b, g, r; // 3 channels

  for(int row = 0; row 《 img-》height; row++)

  {

  for (int col = 0; col 《 img-》width; col++)

  {

  b = ((uchar *)(img-》imageData + row * img-》widthStep))[col * img-》nChannels + 0];

  g = ((uchar *)(img-》imageData + row * img-》widthStep))[col * img-》nChannels + 1];

  r = ((uchar *)(img-》imageData + row * img-》widthStep))[col * img-》nChannels + 2];

  }

  }

  初始化使用IplImage *,是一個(gè)指向結(jié)構(gòu)體IplImage的指針:

  IplImage * cvLoadImage(const char * filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)); //load images from specified image

  IplImage * cvCreateImage(CvSize size, int depth, int channels); //allocate memory

  2.CvMat

  首先,我們需要知道,第一,在OpenCV中沒(méi)有向量(vector)結(jié)構(gòu)。任何時(shí)候需要向量,都只需要一個(gè)列矩陣(如果需要一個(gè)轉(zhuǎn)置或者共軛向量,則需要一個(gè)行矩陣)。第二,OpenCV矩陣的概念與我們?cè)诰€性代數(shù)課上學(xué)習(xí)的概念相比,更抽象,尤其是矩陣的元素,并非只能取簡(jiǎn)單的數(shù)值類型,可以是多通道的值。CvMat 的結(jié)構(gòu):

  typedef struct CvMat

  {

  int type;

  int step; /*用字節(jié)表示行數(shù)據(jù)長(zhǎng)度*/

  int* refcount; /*內(nèi)部訪問(wèn)*/

  union {

  uchar* ptr;

  short* s;

  int* i;

  float* fl;

  double* db;

  } data; /*數(shù)據(jù)指針*/

  union {

  int rows;

  int height;

  };

  union {

  int cols;

  int width;

  };

  } CvMat; /*矩陣結(jié)構(gòu)頭*/

  創(chuàng)建CvMat數(shù)據(jù):

  CvMat * cvCreateMat(int rows, int cols, int type); /*創(chuàng)建矩陣頭并分配內(nèi)存*/

  CV_INLine CvMat cvMat((int rows, int cols, int type, void* data CV_DEFAULT); /*用已有數(shù)據(jù)data初始化矩陣*/

  CvMat * cvInitMatHeader(CvMat * mat, int rows, int cols, int type, void * data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP)); /*(用已有數(shù)據(jù)data創(chuàng)建矩陣頭)*/

  對(duì)矩陣數(shù)據(jù)進(jìn)行訪問(wèn):

  /*間接訪問(wèn)*/

  /*訪問(wèn)CV_32F1和CV_64FC1*/

  cvmSet( CvMat* mat, int row, int col, double value);

  cvmGet( const CvMat* mat, int row, int col );

  /*訪問(wèn)多通道或者其他數(shù)據(jù)類型: scalar的大小為圖像的通道值*/

  CvScalar cvGet2D(const CvArr * arr, int idx0, int idx1); //CvArr只作為函數(shù)的形參void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);

  /*直接訪問(wèn): 取決于數(shù)組的數(shù)據(jù)類型*/

  /*CV_32FC1*/

  CvMat * cvmat = cvCreateMat(4, 4, CV_32FC1);

  cvmat-》data.fl[row * cvmat-》cols + col] = (float)3.0;

  /*CV_64FC1*/

  CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);

  cvmat-》data.db[row * cvmat-》cols + col] = 3.0;

  /*一般對(duì)于單通道*/

  CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);

  CV_MAT_ELEM(*cvmat, double, row, col) = 3.0; /*double是根據(jù)數(shù)組的數(shù)據(jù)類型傳入,這個(gè)宏不能處理多通道*/

  /*一般對(duì)于多通道*/

  if (CV_MAT_DEPTH(cvmat-》type) == CV_32F)

  CV_MAT_ELEM_CN(*cvmat, float, row, col * CV_MAT_CN(cvmat-》type) + ch) = (float)3.0; // ch為通道值

  if (CV_MAT_DEPTH(cvmat-》type) == CV_64F)

  CV_MAT_ELEM_CN(*cvmat, double, row, col * CV_MAT_CN(cvmat-》type) + ch) = 3.0; // ch為通道值

  /*多通道數(shù)組*/

  /*3通道*/

  for (int row = 0; row 《 cvmat-》rows; row++)

  {

  p = cvmat -》data.fl + row * (cvmat-》step / 4);

  for (int col = 0; col 《 cvmat-》cols; col++)

  {

  *p = (float) row + col;

  *(p+1) = (float)row + col + 1;

  *(p+2) = (float)row + col + 2;

  p += 3;

  }

  }

  /*2通道*/

  CvMat * vector = cvCreateMat(1,3, CV_32SC2);CV_MAT_ELEM(*vector, CvPoint, 0, 0) = cvPoint(100,100);

  /*4通道*/

  CvMat * vector = cvCreateMat(1,3, CV_64FC4);CV_MAT_ELEM(*vector, CvScalar, 0, 0) = CvScalar(0, 0, 0, 0);

  復(fù)制矩陣操作:

  /*復(fù)制矩陣*/

  CvMat* M1 = cvCreateMat(4,4,CV_32FC1);

  CvMat* M2;

  M2=cvCloneMat(M1);

  3.Mat

  Mat是opencv2.0推出的處理圖像的新的數(shù)據(jù)結(jié)構(gòu),現(xiàn)在越來(lái)越有趨勢(shì)取代之前的cvMat和lplImage,相比之下Mat最大的好處就是能夠更加方便的進(jìn)行內(nèi)存管理,不再需要程序員手動(dòng)管理內(nèi)存的釋放。opencv2.3中提到Mat是一個(gè)多維的密集數(shù)據(jù)數(shù)組,可以用來(lái)處理向量和矩陣、圖像、直方圖等等常見(jiàn)的多維數(shù)據(jù)。

  class CV_EXPORTS Mat

  {

  public:

  /*.。很多方法。.*/

  /*.。..。..。..。.*/

  int flags;(Note :目前還不知道flags做什么用的)

  int dims; /*數(shù)據(jù)的維數(shù)*/

  int rows,cols; /*行和列的數(shù)量;數(shù)組超過(guò)2維時(shí)為(-1,-1)*/

  uchar *data; /*指向數(shù)據(jù)*/

  int * refcount; /*指針的引用計(jì)數(shù)器; 陣列指向用戶分配的數(shù)據(jù)時(shí),指針為 NULL

  /* 其他成員 */

  。..

  };

  從以上結(jié)構(gòu)體可以看出Mat也是一個(gè)矩陣頭,默認(rèn)不分配內(nèi)存,只是指向一塊內(nèi)存(注意讀寫保護(hù))。初始化使用create函數(shù)或者M(jìn)at構(gòu)造函數(shù),以下整理自opencv2.3.1 Manual:

  Mat(nrows, ncols, type, fillValue]);

  M.create(nrows, ncols, type);

  例子:

  Mat M(7,7,CV_32FC2,Scalar(1,3)); /*創(chuàng)建復(fù)數(shù)矩陣1+3j*/

  M.create(100, 60, CV_8UC(15)); /*創(chuàng)建15個(gè)通道的8bit的矩陣*/

  /*創(chuàng)建100*100*100的8位數(shù)組*/

  int sz[] = {100, 100, 100};

  Mat bigCube(3, sz, CV_8U, Scalar:all(0));

  /*現(xiàn)成數(shù)組*/

  double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};

  Mat M = Mat(3, 3, CV_64F, m).inv();

  /*圖像數(shù)據(jù)*/

  Mat img(Size(320,240),CV_8UC3);

  Mat img(height, width, CV_8UC3, pixels, step); /*const unsigned char* pixels,int width, int height, int step*/

  /*使用現(xiàn)成圖像初始化Mat*/

  IplImage* img = cvLoadImage(“greatwave.jpg”, 1);

  Mat mtx(img,0); // convert IplImage* -》 Mat; /*不復(fù)制數(shù)據(jù),只創(chuàng)建一個(gè)數(shù)據(jù)頭*/

  訪問(wèn)Mat的數(shù)據(jù)元素:

  /*對(duì)某行進(jìn)行訪問(wèn)*/

  Mat M;

  M.row(3) = M.row(3) + M.row(5) * 3; /*第5行擴(kuò)大三倍加到第3行*/

  /*對(duì)某列進(jìn)行復(fù)制操作*/

  Mat M1 = M.col(1);

  M.col(7).copyTo(M1); /*第7列復(fù)制給第1列*/

  /*對(duì)某個(gè)元素的訪問(wèn)*/

  Mat M;

  M.at《double》(i,j); /*double*/

  M.at(uchar)(i,j); /*CV_8UC1*/

  Vec3i bgr1 = M.at(Vec3b)(i,j) /*CV_8UC3*/

  Vec3s bgr2 = M.at(Vec3s)(i,j) /*CV_8SC3*/

  Vec3w bgr3 = M.at(Vec3w)(i,j) /*CV_16UC3*/

  /*遍歷整個(gè)二維數(shù)組*/

  double sum = 0.0f;

  for(int row = 0; row 《 M.rows; row++)

  {

  const double * Mi = M.ptr《double》(row);

  for (int col = 0; col 《 M.cols; col++)

  sum += std::max(Mi[j], 0.);

  }

  /*STL iterator*/

  double sum=0;

  MatConsTIterator《double》 it = M.begin《double》(), it_end = M.end《double》();

  for(; it != it_end; ++it)

  sum += std::max(*it, 0.);

  Mat可進(jìn)行Matlab風(fēng)格的矩陣操作,如初始化的時(shí)候可以用iniTIalizers,zeros(), ones(), eye()。 除以上內(nèi)容之外,Mat還有有3個(gè)重要的方法:

  Mat mat = imread(const String* filename); // 讀取圖像imshow(const string frameName, InputArray mat); // 顯示圖像imwrite (const string& filename, InputArray img); //儲(chǔ)存圖像

  CvMat, Mat, IplImage之間的互相轉(zhuǎn)換

  IpIImage -》 CvMat

  /*cvGetMat*/

  CvMat matheader;

  CvMat * mat = cvGetMat(img, &matheader);

  /*cvConvert*/

  CvMat * mat = cvCreateMat(img-》height, img-》width, CV_64FC3);

  cvConvert(img, mat)

  IplImage -》 Mat

  Mat::Mat(const IplImage* img, bool copyData=false);/*default copyData=false,與原來(lái)的IplImage共享數(shù)據(jù),只是創(chuàng)建一個(gè)矩陣頭*/

  例子:

  IplImage* iplImg = cvLoadImage(“greatwave.jpg”, 1);

  Mat mtx(iplImg); /* IplImage * -》 Mat,共享數(shù)據(jù); or : Mat mtx = iplImg;*/

  Mat -》 IplImage

  Mat M

  IplImage iplimage = M; /*只創(chuàng)建圖像頭,不復(fù)制數(shù)據(jù)*/

  CvMat -》 Mat

  Mat::Mat(const CvMat* m, bool copyData=false); /*類似IplImage -》 Mat,可選擇是否復(fù)制數(shù)據(jù)*/

  Mat -》 CvMat

  例子(假設(shè)Mat類型的imgMat圖像數(shù)據(jù)存在):

  CvMat cvMat = imgMat;/*Mat -》 CvMat, 類似轉(zhuǎn)換到IplImage,不復(fù)制數(shù)據(jù)只創(chuàng)建矩陣頭

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉