IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV + CPP 系列(卌六)目标检测与计数 -> 正文阅读

[人工智能]OpenCV + CPP 系列(卌六)目标检测与计数


本文章处理如下两张图
在这里插入图片描述

一、计数

图像算法的综合使用:

  1. 分析图像(图像目标形状,纹理,颜色)等复杂信息。
  2. 考虑处理方法,形态学+距离变换函数 显著化目标
  3. 使用自适应阈值(或者 局部峰值计数、分水岭算法等)进行目标切分
  4. 计数 可视化。

头文件 image_feature_all.h:声明类与公共函数

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/xfeatures2d.hpp>  //新增引入库

using namespace cv;
using namespace std;


class ImageFeature {
public:
	void object_detect(Mat& image);
	void object_area_detect(Mat& image);

};

主函数main.cpp调用该类的公共成员函数

#include "image_feature_all.h"



int main(int argc, char** argv) {
	const char* img_path = "D:\\Desktop\\match_dst.jpg";
	Mat image = imread(img_path, IMREAD_GRAYSCALE);
	if (image.empty()) {
		cout << "图像数据为空,读取文件失败!" << endl;
	}
	ImageFeature imgfeature;
	imgfeature.object_detect(image);
	imgfeature.object_area_detect(image);

	waitKey(0);
	destroyAllWindows();
	return 0;
}
void ImageFeature::object_detect(Mat& image) {
	Mat gray_img, binary_img;
	cvtColor(image, gray_img, COLOR_BGR2GRAY);
	threshold(gray_img, binary_img, 0, 255, THRESH_BINARY_INV | THRESH_TRIANGLE);
	imshow("binary_img", binary_img);

	//形态学操作
	Mat kernel_diamond = (Mat_<uchar>(5, 5) <<
		0, 0, 1, 0, 0, 
		0, 1, 1, 1, 0, 
		1, 1, 1, 1, 1, 
		0, 1, 1, 1, 0,
		0, 0, 1, 0, 0);

	// 测试几种不同的去噪分割方式。
	//Mat morph_img, morph_img2, morph_img3;
	//Mat kernel = getStructuringElement(cv::MORPH_RECT, Size(5, 5));
	//morphologyEx(binary_img.clone(), morph_img, MORPH_OPEN, kernel_diamond, Point(-1, -1), 1);
	//morphologyEx(binary_img.clone(), morph_img2, MORPH_OPEN, kernel, Point(-1,-1), 1);

	Mat morph_img;
	Mat kernel = getStructuringElement(cv::MORPH_RECT, Size(5, 5));
	erode(binary_img, morph_img, kernel, Point(-1, -1), 1);

	//距离变换, 转成8U;
	Mat dist, dist_8u;
	distanceTransform(morph_img, dist, DIST_L2, 3);
	normalize(dist, dist, 0, 0.9, NORM_MINMAX);
	dist.convertTo(dist_8u, CV_8U);
	imshow("dist", dist);

	//自适应二值化分割
	adaptiveThreshold(dist_8u, dist_8u, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 95, 0.0);
	erode(dist_8u, dist_8u, kernel, Point(-1, -1), 1);
	dilate(dist_8u, dist_8u, kernel, Point(-1, -1), 3);

	// 查找轮廓-->轮廓质心-->连通域计数可视化
	vector<vector<Point>> contours;
	findContours(dist_8u, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	vector<Moments> moments_cap(contours.size());
	vector<Point> centers(contours.size());

	for (size_t i = 0; i < contours.size(); i++){
		moments_cap[i] = moments(contours[i]);
		centers[i] = Point(
			static_cast<float>(moments_cap[i].m10 / moments_cap[i].m00),
			static_cast<float>(moments_cap[i].m01 / moments_cap[i].m00)
		);
	}

	Mat result_img = Mat::zeros(image.size(), CV_8UC3);
	RNG rng(12312);
	for (size_t i = 0; i < contours.size(); i++){
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		drawContours(result_img, contours, i, color, 2, 8);
		putText(result_img, to_string(i), centers[i], 0, 1, color, 2, 8, 0);
	}
	imshow("result_img", result_img);
}
可视化

关键几步展示
在这里插入图片描述

二、目标检测(对象提取)

void ImageFeature::object_area_detect(Mat& image) {
	int height = image.rows;
	int width = image.cols;
	Mat gray_img, binary_img;
	cvtColor(image, gray_img, COLOR_BGR2GRAY);
	GaussianBlur(gray_img, gray_img, Size(5, 5), 15);
	threshold(gray_img, binary_img, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);
	imshow("binary_img", binary_img);

	Mat morph_img;
	Mat kernel = getStructuringElement(cv::MORPH_RECT, Size(3, 3));
	morphologyEx(binary_img, morph_img, MORPH_CLOSE, kernel, Point(-1, -1), 2);
	imshow("morph_img", morph_img);

	vector<vector<Point>> contours;
	findContours(morph_img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	Mat resultImage = Mat::zeros(image.size(), CV_8UC3);
	for (size_t i = 0; i < contours.size(); i++) {
		Rect rect = boundingRect(contours[i]);
		if (rect.width > width / 2 && rect.height > height / 2) {
			double Area = contourArea(contours[i]);
			double length = arcLength(contours[i], true);
			drawContours(resultImage, contours, i, Scalar(0, 0, 255), 2, 8);
			putText(resultImage, "Area  : "+to_string(Area), Point(static_cast<int>(width / 2), height - 80), 0, 0.8, Scalar(255, 0, 0), 2, 8, 0);
			putText(resultImage, "length: "+to_string(length), Point(static_cast<int>(width / 2), height - 40), 0, 0.8, Scalar(255, 0, 0), 2, 8, 0);
		}
	}
	imshow("resultImage", resultImage);
}
可视化

在这里插入图片描述
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:12:14  更:2021-08-25 12:14:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:47:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码