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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值