1. 程式人生 > >使用Opencv獲取每個畫素點的RGB顏色分量/HSV顏色分量

使用Opencv獲取每個畫素點的RGB顏色分量/HSV顏色分量

一.  所需結構體

CvScalar

結構體介紹

typedef struct CvScalar  
{  
  double val[4];  //BGRA
  }CvScalar;  
二. 所需函式
cvGet2D

函式功能:獲取畫素點上的RGB顏色分量,如果是灰度圖直接返回灰度圖顏色分量

函式原型:

CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
引數介紹:
const CvArr* arr:    要獲取畫素點顏色分量的影象指標
int idx0:            對應第幾行
int idx1:            對應第幾列
返回值:將獲取到的畫素點值以BGR的順序返回到CvScalar結構體的val元素中,如果是灰度圖那麼val第一個元素就是灰度圖的顏色分量

三. 開始編寫程式碼

實驗圖:


jpg格式

3.1 開啟一張圖片

//載入影象到記憶體
IplImage *image = cvLoadImage("D:\\1.jpg");
if (image == NULL){	//open image error
	printf("開啟影象檔案失敗!");
	return -1;
}

獲取畫素點顏色RGB顏色分量

CvScalar scalar;	//scalar
	for (int i = 0; i <= image->height-1; ++i){
		for (int j = 0; j <= image->width-1; ++j){
			scalar = cvGet2D(image,i,j);	//獲取畫素點的RGB顏色分量
			printf("第%d個畫素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
			getchar();	//防止列印速度太快,暫停一次列印一次
		}
	}

執行結果:


完整程式碼:

	//載入影象到記憶體
	IplImage *image = cvLoadImage("D:\\1.jpg");
	if (image == NULL){	//open image error
		printf("開啟影象檔案失敗!");
		return -1;
	}
	CvScalar scalar;	//scalar
	for (int i = 0; i <= image->height-1; ++i){
		for (int j = 0; j <= image->width-1; ++j){
			scalar = cvGet2D(image,i,j);	//獲取畫素點的RGB顏色分量
			printf("第%d個畫素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
			getchar();	//防止列印速度太快,暫停一次列印一次
		}
	}
HSV通道:

需要cvCvtColor函式,我們只需要複用一下上面的程式碼即可

注意HSV顏色空間沒有順序問題,而RGB顏色空間Opencv使用的是BGR!

//載入影象到記憶體
	IplImage *image = cvLoadImage("D:\\1.jpg");
	if (image == NULL){	//open image error
		printf("開啟影象檔案失敗!");
		return -1;
	}
	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意影象必須和輸入影象的size,顏色位深度,通道一致
	cvZero(image1); //清空image_data資料  
	cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV  
	CvScalar scalar;	//scalar
	for (int i = 0; i <= image1->height-1; ++i){	//HSV
		for (int j = 0; j <= image1->width-1; ++j){
			scalar = cvGet2D(image1, i, j);	//獲取畫素點的RGB顏色分量
			printf("第%d個畫素的H:%d°,S:%lf,V:%lf\n", (i*image->width) + j, (int)scalar.val[0]*2, scalar.val[1]/255, scalar.val[2]/255);
			getchar();	//防止列印速度太快,暫停一次列印一次
		}
	}

執行結果: