// Starfeatures_detector2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/features2d.hpp>
using namespace cv;
using namespace std;
int main()
{
//读取视频
VideoCapture cap;
cap.open("C:\\Users\\lbn\\Desktop\\夜间车辆\\6.mp4");
if (!cap.isOpened()) {
cout << "Failed to load the video!" << endl;
return -1;
}
Mat image;
while (1) {
cap >> image;//等同于cap.read(frame);
if (image.empty())break;//如果某帧为空则退出循坏
//重置图片大小
//Mat Image(480, 640, CV_8UC3);
//const int nTimes = 100;
//for (int i = 0; i < nTimes; i++)
//{
// //resize(srcImage, Image, dstImage.size(), 0, 0);
// resize(image, Image, Image.size(), 0, 0);
//}
Mat Image;
image.copyTo(Image);
//灰度化
Mat image_gray;
cvtColor(Image, image_gray, CV_RGB2GRAY);
//将图像最上面的1/3区域置零
Size img_size = Image.size();
Mat image_t = Image.clone();
Mat Mask(cvFloor(image_t.rows / 3), image_t.cols, CV_8UC3, Scalar(0));
Mat roi = image_t(Rect(0, 0, image_t.cols, cvFloor(image_t.rows / 3)));
Mask.copyTo(roi);
//double t1 = (double)getTickCount();
//for (int i = 0; i < cvFloor(image_t.rows / 3); i++) {
// for (int j = 0; j < image_t.cols; j++) {
// image_t.at<Vec3b>(i, j)[0] = 0;
// image_t.at<Vec3b>(i, j)[1] = 0;
// image_t.at<Vec3b>(i, j)[2] = 0;
// }
//}
//double t2 = (double)getTickCount();
//cout << "time:" << (t2 - t1) * 1000 / getTickFrequency() << endl;
//imshow("【原图】", image_t);
//=============================================================在RGB空间分割红色和白色区域================================================================//
//将RGB图像分离通道
vector<Mat> imageRGB;
Mat dst;
split(image_t, imageRGB);
merge(imageRGB, dst);
//显示图像
//imshow("dst",dst);
//分离RGB通道并分别显示
vector<Mat> b, g, r;
Mat tmp(image_t.size(), CV_8U, Scalar(0));
for (int i = 0; i < 3; i++) {
if (i == 0)
b.push_back(imageRGB[0]);
else
b.push_back(tmp);
if (i == 1)
g.push_back(imageRGB[1]);
else
g.push_back(tmp);
if (i == 2)
r.push_back(imageRGB[2]);
else
r.push_back(tmp);
}
//merge(b,dst);
//imshow("b",dst);
//merge(g,dst);
//imshow("g",dst);
merge(r, dst);
//imshow("r",dst);
//检测红色强度较高的区域
Mat imgdst;
dst.copyTo(imgdst);
for (int i = 0; i < image_t.rows; i++) {
for (int j = 0; j < image_t.cols; j++) {
//检测红色区域
if (dst.at<Vec3b>(i, j)[2] >= 200 && dst.at<Vec3b>(i, j)[2] <= 255)
{
imgdst.at<Vec3b>(i, j)[0] = 0;
imgdst.at<Vec3b>(i, j)[1] = 0;
imgdst.at<Vec3b>(i, j)[2] = 255;
}
else
{
imgdst.at<Vec3b>(i, j)[0] = 0;
imgdst.at<Vec3b>(i, j)[1] = 0;
imgdst.at<Vec3b>(i, j)[2] = 0;
}
/* if (dst.at<Vec3b>(i, j)[0] == 255 && dst.at<Vec3b>(i, j)[1] == 255 && dst.at<Vec3b>(i, j)[2] == 255) {
imgdst.at<Vec3b>(i, j)[0] = 0;
imgdst.at<Vec3b>(i, j)[1] = 0;
imgdst.at<Vec3b>(i, j)[2] = 255;
}
else
{
imgdst.at<Vec3b>(i, j)[0] = 0;
imgdst.at<Vec3b>(i, j)[1] = 0;
imgdst.at<Vec3b>(i, j)[2] = 0;
}*/
}
}
// imshow("红色提取RGB", imgdst);
//进行形态学腐蚀膨胀,以去除小区域
int g_nStructElementSize = 2;
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1), Point(g_nStructElementSi