二级指针和三级指针作为形参的具体应用:
二级指针作为形参时,内存分配在函数外进行。函数内只需要进行相关操作;三级指针作为形参时,可以在函数内分配空间。
三级指针作为形参代码:
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;
}