RM2016视觉开源OpenCv2代码
来源:互联网 发布:caffe推荐系统 编辑:程序博客网 时间:2024/05/17 07:23
RM2016视觉开源OpenCv2代码
#include<opencv2/opencv.hpp>#include<iostream>#include<cstdio>#include<omp.h>using namespace std;using namespace cv;#define T_ANGLE_THRE 10#define T_SIZE_THRE 5void brightAdjust(Mat &src, Mat &dst, double dContrast, double dBright){ int nVal; int rowNumber = dst.rows; int colNumber = dst.cols*dst.channels(); omp_set_num_threads(8); #pragma omp parallel for for (int i = 0; i < rowNumber; i++) { uchar* dstdata = dst.ptr<uchar>(i); uchar* srcdata = src.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { nVal = ((dContrast * srcdata[j]) + dBright); if (nVal > 255) nVal = 255; else if (nVal < 0) nVal = 0; dstdata[j] = nVal; } }}void getDiffImage(Mat &src1, Mat &src2, Mat &dst, int nThre){ int nVal; int rowNumber = src1.rows; int colNumber = src1.cols * src1.channels(); omp_set_num_threads(8);#pragma omp parallel for for (int i = 0; i < rowNumber; i++) { uchar* srcData1 = src1.ptr<uchar>(i); uchar* srcData2 = src2.ptr<uchar>(i); uchar* dstData = dst.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { if (srcData1[j] - srcData2[j]> nThre) dstData[j] = 255; else dstData[j] = 0; } }}vector<RotatedRect> armorDetect(vector<RotatedRect> vEllipse){ vector<RotatedRect> vRlt; RotatedRect armor; int nL, nW; double dAngle; vRlt.clear(); if (vEllipse.size() < 2) return vRlt; for (unsigned int nI = 0; nI < vEllipse.size() -1; nI++) { for (unsigned int nJ = nI + 1; nJ < vEllipse.size(); nJ++) { dAngle = abs(vEllipse[nI].angle - vEllipse[nJ].angle); while (dAngle > 180) dAngle -= 180; if ((dAngle < T_ANGLE_THRE || 180 - dAngle < T_ANGLE_THRE) && abs(vEllipse[nI].size.height - vEllipse[nJ].size.height) < (vEllipse[nI].size.height + vEllipse[nJ].size.height) / T_SIZE_THRE && abs(vEllipse[nI].size.width - vEllipse[nJ].size.width) < (vEllipse[nI].size.width + vEllipse[nJ].size.width) / T_SIZE_THRE) { armor.center.x = (vEllipse[nI].center.x + vEllipse[nJ].center.x) / 2; armor.center.y = (vEllipse[nI].center.y + vEllipse[nJ].center.y) / 2; armor.angle = (vEllipse[nI].angle + vEllipse[nJ].angle) / 2; if (180 - dAngle < T_ANGLE_THRE) armor.angle += 90; nL = (vEllipse[nI].size.height + vEllipse[nJ].size.height) / 2; nW = sqrt((vEllipse[nI].center.x - vEllipse[nJ].center.x) * (vEllipse[nI].center.x - vEllipse[nJ].center.x) + (vEllipse[nI].center.y - vEllipse[nJ].center.y) * (vEllipse[nI].center.y - vEllipse[nJ].center.y)); if (nL < nW) { armor.size.height = nL; armor.size.width = nW; } else { armor.size.height = nW; armor.size.width = nL; } vRlt.push_back(armor); } } } return vRlt;}void drawBox(RotatedRect box, Mat &img){ Point2f vertex[4]; box.points(vertex); for (int i = 0; i < 4; i++) { line(img, vertex[i], vertex[(i + 1) % 4], Scalar(0, 0, 255), 2, CV_AA); }}int main(){ bool bFlag=true; vector<Mat> channels; vector<RotatedRect> vEllipse; vector<vector<Point> > contours; vector<Vec4i> hierarchy; vector<RotatedRect> vRlt; RotatedRect box; Point2f vertex[4]; Mat frame, bImage, gImage, rImage, rawImage, grayImage, rlt; Mat binary; VideoCapture cap("RedCar.avi"); cap >> frame; frame.copyTo(rawImage); double time = 0; unsigned int frames=0; while (1) { frames++; double t0 = getTickCount(); brightAdjust(frame, rawImage, 1, -120); split(rawImage, channels); bImage = channels.at(0); gImage = channels.at(1); rImage = channels.at(2); bImage.copyTo(binary); getDiffImage(rImage, gImage, binary, 25); Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); dilate(binary, grayImage, element, Point(-1, -1), 3); erode(grayImage, rlt, element, Point(-1, -1), 1); findContours(rlt, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); if (contours.size() == 0) continue; for (int i = 0; i < contours.size(); i++) { if ((contourArea(contours[i])>300 && contours.size()>10) || (contours.size()<10 && contours.size()>30) ) { box = minAreaRect(Mat(contours[i])); //原代码是用椭圆拟合,然而我的电脑上fitellipse()出错 box.points(vertex); for (int i = 0; i < 4; i++) line(rlt, vertex[i], vertex[(i + 1) % 4], Scalar(255), 2, CV_AA); if ((box.size.height / box.size.width) > 1.0) bFlag = true; for (int nI = 0; nI < 5; nI++) { for (int nJ = 0; nJ < 5; nJ++) { if (box.center.y - 2 + nJ > 0 && box.center.y - 2 + nJ < 480 && box.center.x - 2 + nI > 0 && box.center.x - 2 + nI < 640) { Vec3b sx = frame.at<Vec3b>((int)(box.center.y - 2 + nJ), (int)(box.center.x - 2 + nI)); if (sx[0] < 200 || sx[1] < 200 || sx[2] < 200) { int x1 = sx[0]; int x2 = sx[1]; int x3 = sx[2]; bFlag = false; break; } } } } if (bFlag) { vEllipse.push_back(box); } } } vRlt = armorDetect(vEllipse); for (unsigned int nI = 0; nI < vRlt.size(); nI++) drawBox(vRlt[nI], frame); vEllipse.clear(); vRlt.clear(); //imshow("B", rImage); //imshow("G", gImage); //imshow("R", bImage); imshow("Bi", binary); imshow("RLT", rlt); imshow("frame", frame); //imshow("2", rawImage); cvWaitKey(30); cap >> frame; time += (getTickCount() - t0) / getTickFrequency(); cout << frames / time << " fps" << endl; } return 0;}
0 0
- RM2016视觉开源OpenCv2代码
- opencv2 计算机机器视觉编程手册 代码
- opencv2实现n张图像拼接_stitcher具体之代码1_计算机视觉大作业1
- opencv2实现n张图像拼接_stitcher具体之代码2(简化版)_计算机视觉大作业2
- OpenCV2计算机视觉编程手册(1)
- OpenCV2计算机视觉编程手册(2)
- OpenCV2计算机视觉编程手册(3)
- opencv2 计算机视觉编程手册 estimateF.cpp
- 《OpenCV2计算机视觉编程手册》2-5
- opencv2计算机视觉编程手册(中文)pdf
- opencv2肤色检测代码
- 计算机视觉算法开源实现 代码程序 Computer Vision Algorithm Implementations
- 视觉代码和软件
- 计算机视觉代码合集一
- 计算机视觉代码合集二 .
- 计算机视觉代码资源
- 视觉代码合集
- 计算机视觉一些代码
- 谢泽文的C++第一次实验报告2
- leetcode:Median of Two Sorted Arrays 【Java】
- 开始学习 Linux
- hibernate总结---hibernate简单使用
- 备份oracle数据脚本
- RM2016视觉开源OpenCv2代码
- 用户首选项
- Android:分页下载示例(PullToRefresh)
- Android studio 导入xutils3报错
- poj 3187 Backward Digit Sums(dfs暴搜)
- 三月八日问题记录
- Android中的属性动画(Property Animation)——Android开发艺术探索笔记
- 字符流小说 分页功能!
- 简单的求和题