用C++使用opencv生成一个能框出图片中人体轮廓的程序
时间: 2023-05-25 13:02:53 浏览: 104
基于Opencv的轮廓检出示例 C++编写
3星 · 编辑精心推荐
以下是使用C和OpenCV库生成能框出图片中人体轮廓的程序。该程序基于霍夫变换和二值化技术进行图像处理。
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main(int argc, char** argv) {
if (argc != 2) {
printf("Usage: program <input_image>\n");
exit(1);
}
IplImage* input_image = cvLoadImage(argv[1], 1); // 加载输入图像
if (!input_image) {
printf("Error: failed to load image %s!\n", argv[1]);
exit(1);
}
IplImage* gray_image = cvCreateImage(cvGetSize(input_image), IPL_DEPTH_8U, 1); // 创建灰度图像
cvCvtColor(input_image, gray_image, CV_BGR2GRAY); // 转换为灰度图像
cvSmooth(gray_image, gray_image, CV_GAUSSIAN, 5, 5); // 平滑处理
IplImage* edges_image = cvCreateImage(cvGetSize(input_image), IPL_DEPTH_8U, 1); // 创建边缘图像
cvCanny(gray_image, edges_image, 100, 200, 3); // 边缘检测
CvMemStorage* storage = cvCreateMemStorage(0); // 创建内存存储
CvSeq* contours = 0;
int num_contours = cvFindContours(edges_image, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); // 查找轮廓
IplImage* output_image = cvCreateImage(cvGetSize(input_image), IPL_DEPTH_8U, 3); // 创建输出图像
cvZero(output_image); // 将图像置为黑色
CvSeq* contour;
for (contour = contours; contour != 0; contour = contour->h_next) {
CvRect rect = cvBoundingRect(contour, 0); // 计算轮廓的边界框
double area = fabs(cvContourArea(contour, CV_WHOLE_SEQ)); // 计算轮廓的面积
double length = cvContourPerimeter(contour); // 计算轮廓的周长
if (area > 500 && length > 100) { // 根据面积和周长过滤轮廓
cvDrawContours(output_image, contour, CV_RGB(255, 0, 0), CV_RGB(0, 255, 0), 0, CV_FILLED, 8, cvPoint(0,0)); // 绘制轮廓
cvRectangle(output_image, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), CV_RGB(0, 0, 255), 2, 8, 0); // 绘制边界框
}
}
cvNamedWindow("input_image", CV_WINDOW_AUTOSIZE); // 创建输入图像窗口
cvShowImage("input_image", input_image); // 显示输入图像
cvNamedWindow("output_image", CV_WINDOW_AUTOSIZE); // 创建输出图像窗口
cvShowImage("output_image", output_image); // 显示输出图像
cvWaitKey(0); // 等待按键
cvReleaseImage(&input_image); // 释放输入图像
cvReleaseImage(&gray_image); // 释放灰度图像
cvReleaseImage(&edges_image); // 释放边缘图像
cvReleaseImage(&output_image); // 释放输出图像
cvDestroyAllWindows(); // 销毁所有窗口
return 0;
}
```
阅读全文