c++ opencv 画框
时间: 2023-07-24 22:25:17 浏览: 139
您可以使用OpenCV的rectangle函数来画矩形框。下面是一个示例代码,演示如何在图像上画矩形框:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取图片
Mat img = imread("input.jpg");
// 画矩形框
rectangle(img, Point(100, 100), Point(200, 200), Scalar(0, 0, 255), 2);
// 显示结果
imshow("result", img);
waitKey();
return 0;
}
```
在上述代码中,我们首先读取了一张图片。然后,使用rectangle函数画了一个左上角坐标为(100, 100)、右下角坐标为(200, 200)、颜色为红色、线宽为2的矩形框。最后,将结果显示出来。
请注意,上述代码仅仅是演示如何画矩形框,实际应用中可能需要根据具体需求进行调整,比如画不同颜色、不同宽度的矩形框。
相关问题
用基于c++的opencv写一个识别人脸的代码
好的,以下是用基于C的OpenCV编写的人脸识别代码:
```c
#include <stdio.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
int main()
{
// 打开摄像头
CvCapture *capture = cvCreateCameraCapture(0);
// 创建窗口
cvNamedWindow("Face Recognition", CV_WINDOW_AUTOSIZE);
// 加载人脸检测器分类器
CvHaarClassifierCascade *cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml");
// 循环处理每一帧
while (1) {
// 从摄像头中读取一帧
IplImage *frame = cvQueryFrame(capture);
// 计算图片大小
CvSize size = cvGetSize(frame);
// 转化成灰度图
IplImage *gray = cvCreateImage(size, IPL_DEPTH_8U, 1);
cvCvtColor(frame, gray, CV_RGB2GRAY);
// 检测人脸
CvSeq *faces = cvHaarDetectObjects(gray, cascade, cvCreateMemStorage(), 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(30, 30));
// 遍历所有人脸,并画出矩形框
for (int i = 0; i < faces->total; i++) {
CvRect *rect = (CvRect*)cvGetSeqElem(faces, i);
cvRectangle(frame, cvPoint(rect->x, rect->y), cvPoint(rect->x + rect->width, rect->y + rect->height), CV_RGB(255,0,0), 3, 4, 0);
}
// 显示图片
cvShowImage("Face Recognition", frame);
// 释放资源
cvReleaseImage(&gray);
// 等待按下ESC键来退出
char c = cvWaitKey(10);
if (c == 27) {
break;
}
}
// 释放资源
cvReleaseCapture(&capture);
cvReleaseHaarClassifierCascade(&cascade);
// 销毁窗口
cvDestroyWindow("Face Recognition");
return 0;
}
```
这个程序使用了OpenCV提供的人脸检测器分类器,从摄像头读取每一帧图像,并使用分类器识别人脸并在图像上画框。请注意,这个程序仅仅是一个演示,没有考虑到人脸实时跟踪的问题,如果要实现更高级的人脸识别应用,还需要进一步的优化。
连通域算法画框图 c++
在C++中,有很多算法可以用于计算连通域并画出框图,下面是一种基于OpenCV库的实现方式:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 读取图像
Mat image = imread("input.png");
// 转为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 二值化
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY);
// 计算连通域
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制边界框
for (size_t i = 0; i < contours.size(); i++)
{
Rect rect = boundingRect(contours[i]);
rectangle(image, rect, Scalar(0, 0, 255), 2);
}
// 显示结果
imshow("result", image);
waitKey(0);
return 0;
}
```
上述代码中,首先读取图像并将其转为灰度图像,然后使用二值化操作将其转为二值图像。然后使用`findContours`函数计算出所有的连通域,使用`boundingRect`函数计算出每个连通域的边界框,并使用`rectangle`函数将其绘制出来。最后将结果显示出来即可。
需要注意的是,上述代码只能处理单通道的二值图像,如果需要处理多通道图像或其他类型的连通域,需要根据具体需求进行修改。
阅读全文