1. 程式人生 > >C\C++三級指標作為形參

C\C++三級指標作為形參

二級指標和三級指標作為形參的具體應用:

    二級指標作為形參時,記憶體分配在函式外進行。函式內只需要進行相關操作;三級指標作為形參時,可以在函式內分配空間。

三級指標作為形參程式碼:

int skinDetect(unsigned char *frame, int _width, int _height, Rect*** ppp_rect ,int *skin_size){

	int width = _width;
	int height = _height;

	cv::Mat src;
	cv::Mat skinMask;

	src.create(height * 3 / 2, width, CV_8UC1);
	skinMask.create(height, width, CV_8UC1);

	skinMask = 0;

	cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7));

	memcpy(src.data, frame, height * width * 3 / 2 * sizeof(unsigned char));

	
	GaussianBlur(src, src, cv::Size(5, 5), 2, 2);


	unsigned char *pYPlane = src.data;
	unsigned char *pUPlane = src.data + height * width;
	unsigned char *pVPlane = src.data + (height * width) / 4 * 5;
	unsigned char *pMask = skinMask.data;



	for (int i = 0; i < height / 2; i++)
	for (int j = 0; j < width / 2; j++){
		unsigned char u = pUPlane[i * width / 2 + j];
		unsigned char v = pVPlane[i * width / 2 + j];
		unsigned char y = pYPlane[2 * i * width + 2 * j];

		if ((u > 110 && u< 127) && (v > 133 && v < 173) /*&& (y > 60 && y < 155)*/)//skin
		{
			pMask[2 * i * width + 2 * j] = 255;
			pMask[2 * i * width + 2 * j + 1] = 255;

			pMask[(2 * i + 1) * width + 2 * j] = 255;
			pMask[(2 * i + 1) * width + 2 * j + 1] = 255;

		}
		
	}

	/*imshow("skinMask", skinMask);
	cv::waitKey(0);*/
	morphologyEx(skinMask, skinMask, cv::MORPH_DILATE, element);

	//尋找最外層輪廓  
	std::vector<std::vector<cv::Point>> contours;
	std::vector<cv::Vec4i> hierarchy;
	findContours(skinMask, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());

	cv::Mat imageContours = cv::Mat::zeros(skinMask.size(), CV_8UC1); //最小外接矩形畫布  

	
	**ppp_rect = (Rect**)malloc(contours.size() * sizeof(Rect*));// malloc 1

	int cnt = 0;

	for (int i = 0; i<contours.size(); i++)
	{
		if (contours[i].size() < 200)
			continue;

		//繪製輪廓  
		drawContours(imageContours, contours, i, cv::Scalar(255), 1, 8, hierarchy);

		//繪製輪廓的最小外結矩形  
		cv::RotatedRect rect = minAreaRect(contours[i]);
		cv::Point2f P[4];
		rect.points(P);

		int minx = min4(P[0].x, P[1].x, P[2].x, P[3].x);
		int miny = min4(P[0].y, P[1].y, P[2].y, P[3].y);

		int maxx = max4(P[0].x, P[1].x, P[2].x, P[3].x);
		int maxy = max4(P[0].y, P[1].y, P[2].y, P[3].y);

		//cv::Rect rect2(minx, miny, maxx - minx, maxy - miny);
		_Rect ret_rect{ minx, miny, maxx - minx, maxy - miny };

		//cout << minx << endl;

		(*ppp_rect)[cnt] = (Rect*)malloc(sizeof(Rect));//malloc 2

		memset((*ppp_rect)[cnt], 0, sizeof(Rect));

		memcpy((*ppp_rect)[cnt], &ret_rect, sizeof(Rect));

		//rectangle(imageContours, rect2, cv::Scalar::all(255), 2);
		cnt++;

	}
	*skin_size = cnt;
	//std::cout << endl<<cnt << std::endl;
	//imshow("MinAreaRect", imageContours);
	//cv::waitKey();

	/*if (pp_rect == NULL)
	std::cout <<"error" << std::endl;*/
	/*for (int i = 0; i < cnt; i++){
	std::cout << "第" << i << "個區域:"
	<< (*pp_rect)[i]->_x
	<< std::endl;
	}*/
	return 0;
}

相關推薦

C\C++三級指標作為

二級指標和三級指標作為形參的具體應用:    二級指標作為形參時,記憶體分配在函式外進行。函式內只需要進行相關操作;三級指標作為形參時,可以在函式內分配空間。三級指標作為形參程式碼:int skinDetect(unsigned char *frame, int _width

C語言指標作為的例子

編寫子函動態申請記憶體,並將記憶體地址返回供主函式使用; 程式碼如下: #include<stdio.h> #include<malloc.h> int getData(float **data_buffer,int *data_

C語言指標作為的一些問題

指標作為形參肯定有很多都不清楚其中具體的原理,我也是最近摸清了些門道: 下面就用一些例子來給大家說明: void myMalloc(char *s) //我想在函式中分配記憶體,再返回 { s=(char *) malloc(100); } void m

C語言中陣列指標 作為

2015 0605 在修改程式的過程中,看到兩種將陣列作為形參的方法,於是搜了一下,找了一下比較全面地介紹陣列指標的文章。 先寫下我遇到的兩種方式: 方式1: void filter_c(long double *,long double *,float *,int);//

C++中數組作為進行傳遞(轉)

傳遞 highlight bsp 是個 也不能 fun 浪費 tor tmp 有兩種傳遞方法,一種是function(int a[]); 另一種是function(int *a) 這兩種兩種方法在函數中對數組參數的修改都會影響到實參本身的值! 對於第一種,根據之前所學,

指標作為進行傳遞注意事項

一個例子 #include<iostream> using namespace std; int m_value = 1; void func(int *p) { p = &m_value; } int main(int

陣列指標作為傳遞

當陣列作為函式形參時,陣列的地址可以用做函式呼叫的實參。 可以通過陣列地址的傳遞,在函式內可以對該陣列進行訪問和修改。 eg: #include <stdio.h> #define SI

引用和指標作為的區別

int n; int &m = n; 在C++中,多了一個C語言沒有的引用宣告符&,如上,m就是n的引用,簡單的說m就是n的別名,兩者在記憶體中佔同樣的位置,不對m開闢新的記憶體空間,對m的任何操作,對n來說是一樣的。 對於引用,有以下三條規則: (1)

函式中的問題(指標、引用、二重指標作為)

(1)用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。在使用的過程中需要通過對地址的解引用來操作其所指向的變數,同時可以通過指標的自增自減移動從而改變所指向

指標陣列和行指標作為時的區別

用指標陣列作為形參時的表示方法: #include <stdio.h> void fun(int *p[3],int n) { int i,j; for(i=0;i<3;i++) for(j=0;j<n;j++) printf("%d

C++中陣列作為時,實際傳的是指標

傳陣列時,實際上是建立了臨時的指標變數,指向傳進去的那個陣列。在函式中改變形引數組(臨時指標變數)的指向是可以的,只不過這樣做不會改變原來的陣列 //例子說明陣列做形參時,實際上是用一個臨時指標變數做形參,指向傳進去的陣列首地址。實際的陣列是常指標,不能改變它的值。 #i

c++基礎1:指標作為函式

指標作為函式形參傳入的應用非常廣泛,比如:陣列名字作為指標傳入等等.指標作為形參傳入的一大好處就在於可以在函式內部改變指標指向的物件!!!注意,這裡的重點是指標指向的物件,而不是改變指標本身.指標和應用作為形參傳入看似效果一樣:改變指向(引用)的值,但實際上是有著本質的差別!

c語言基礎(3) 陣列和指標作為的問題

字串 char a[]="abc"; printf("%s",a); fgets(a,100, stdin) //安全的字串輸入函式 printf("%s",a); scanf("%*[^\n]"); //兩個scanf清空輸

C++陣列作為傳遞給函式

以下三種形式等價 void function(const int *arg); void function(const int arg[]); void function(const int arg[

C++ char* 的若干問題之二:char*作為能否影響實的值

有如下方法: int readFeat(char* param) { param = (char *) malloc(10 * sizeof(char)); param = "test char"; param = '\0'; return 0; } 在該方法中,

C++拷貝建構函式_為什麼只能是引用(不能傳值或指標

先給出答案: 拷貝建構函式不能用數值或指標形參原因,不是為了節省建立副本的空間與時間。而是那樣做會無限迴圈遞迴下去。 舉個例子來看一下為什麼會這樣。(反例) class Example() { public: Example(int a):aa(a) {}

c++指標使用改變實

將10個整數按由小到大的順序排列 #include <iostream> using namespace std; int main() { //使用形參改變實引數 //將10個整數按由小到大的順序排列 void select_sort(int *p, i

C++中引用作為的作用

引用的申明方法:型別識別符號  &引用名  = 目標變數名; 注:1.&在此不是求地址運算,而是起標識作用         2.型別識別符號是指目標變數的型別 3.申明引用時必須同時對

c 數組做為時 該數退化為指針

pop c++ col art UNC class blog 長度 color 當數組做為函數的形參的時候,該參數退化為指針,而且是無法直接求得數組的大小。 傳數組

C++中一般引用作和常引用作的問題

#include<iostream> using namespace std; int f(const int &a){return a;} int g(int &a){return a;} int h(int a){return a;} int ma