API:inRange(hsv, Scalar(0, 43, 46), Scalar(10, 255, 255), mask);
实现对视频图像进行处理
以OpenCV中的cv2.inRange()为例:
1. 函数基本形式
• 对于图像操作而言,它的基本形式是cv2.inRange(src, lowerb, upperb)。其中src是要处理的源图像,这个图像可以是单通道(如灰度图)或者多通道(如彩色的RGB图像)。lowerb和upperb是下限和上限边界值。这些边界值的形式取决于图像的通道数。对于单通道图像,它们是单个数值;对于多通道图像,如RGB图像,它们是包含三个数值(分别对应R、G、B通道)的元组或者数组。
2. 工作原理
• 当处理图像时,函数会逐个检查图像中的像素。以彩色图像为例,对于每个像素的RGB值,它会检查红色通道的值是否在lowerb和upperb中红色通道指定的范围内,同时绿色和蓝色通道的值也要满足相应的范围要求。如果一个像素的所有通道值都在指定范围内,那么在输出的结果图像中,这个像素位置的值会被设置为255(白色);否则,这个像素位置的值会被设置为0(黑色)。
• 例如,想要提取一幅彩色图像中红色色调比较明显的区域。可以将lowerb设置为一个较低的红色值(如(0, 0, 100),假设这里红色通道的值相对较大来表示红色调),upperb设置为一个较高的红色值(如(100, 100, 255)),然后使用cv2.inRange函数处理图像,就可以得到一个二值图像,其中白色部分表示红色调区域,黑色部分表示其他区域。
3. 在数值范围检查中的应用
• 在非图像场景下,“inRange”函数(如果是自定义的或者其他库中的类似功能函数)本质上也是检查一个给定的值是否在一个区间内。例如,在一个数据采集系统中,有一个温度传感器传来的数据。可以定义一个“inRange”函数来检查温度值是否在合理的工作温度范围内。假设设备正常工作温度范围是20 - 50摄氏度,当接收到一个温度值,“inRange”函数就可以检查这个值是否大于等于20且小于等于50。如果在这个范围内,可能返回True,否则返回False,以此来判断设备是否处于正常工作温度环境。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void harris_demo(Mat& image);
void shitomas_demo(Mat& image);
int main(int argc, char** argv) {
VideoCapture capture("C:/newword/image/25.mp4");
if (!capture.isOpened()) {
printf("could not open the camera...\n");
}
namedWindow("frame", WINDOW_AUTOSIZE);
Mat frame;
while (true) {
bool ret = capture.read(frame);
if (!ret) break;
imshow("frame", frame);
shitomas_demo(frame);
//imshow("result", frame);
char c = waitKey(1);
if (c == 27) { // ESC
break;
}
}
capture.release();
waitKey(5);
destroyAllWindows();
return 0;
}
void shitomas_demo(Mat& image) {
Mat hsv,mask;
cvtColor(image, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(0, 43, 46), Scalar(10, 255, 255), mask);
Mat se = getStructuringElement(MORPH_RECT, Size(15, 15));
morphologyEx(mask, mask, MORPH_OPEN, se);
//imshow("result", mask);
vector<vector<Point>> contours;
vector<Vec4i> hirearchy;
findContours(mask, contours, hirearchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
int index = -1;
double max_area = 0;
for (size_t t = 0; t < contours.size(); t++) {
double area = contourArea(contours[t]);
if (area > max_area) {
max_area = area;
index = t;
}
}
// 进行轮廓离合于输出
if (index >= 0) {
RotatedRect rrt = minAreaRect(contours[index]);
ellipse(image, rrt, Scalar(255, 0, 0), 2, 8);
circle(image, rrt.center, 4, Scalar(0, 255, 0), 2, 8, 0);
}
imshow("color object detection", image);
}