OpenCV在C++下的练习

opencv(c++)------基础练习三 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; #if 0 int main() { //用VS新建OpenCV工程项目,对附件中的图像automobile.jpg完成题目要求中指定的操作。 //(除特殊注明外,每项5分)。 //1.包含必要的头文件; Mat img = imread("汽车.png"); imshow("原图", im 阅读详情

1.颜色通道转换
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void show_pic(cv::String winname, cv::Mat mat);

int main(int argc, char* argv[])
{
	cv::Mat img = imread("test.jpg", cv::IMREAD_COLOR);

	int width = img.rows;
	int height = img.cols;

	cv::Mat out = img.clone();
	show_pic("original", out);

	for (int i = 0; i < height; ++i)
	{
		for (int j = 0; j < width; ++j)
		{
			unsigned char tmp = out.at<cv::Vec3b>(j, i)[0];
			out.at<cv::Vec3b>(j, i)[0] = img.at<cv::Vec3b>(j, i)[2];
			out.at<cv::Vec3b>(j, i)[2] = tmp;
		}
	}
	show_pic("changed", out);

	return 0;
}


void show_pic(cv::String winname, cv::Mat mat)
{
	cv::imshow(winname, mat);
	cv::waitKey(0);
	cv::destroyAllWindows();
}


2.图像灰度化

预定义类型的结构如下所示:

CV_<bit_depth>(S|U|F)C<number_of_channels>

  • 1–bit_depth—比特数—代表8bite,16bites,32bites,64bites
    举个例子吧–比如说,如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对应的就是CV_8
  • 2–S|U|F–S–代表—signed int—有符号整形
    U–代表–unsigned int–无符号整形
    F–代表–float---------单精度浮点型
  • 3–C<number_of_channels>----代表—一张图片的通道数,比如:
    1–灰度图片–grayImg—是–单通道图像
    2–RGB彩色图像---------是–3通道图像
    3–带Alph通道的RGB图像–是–4通道图像

灰度化的方法:

  • 分量法
  • 最大值法
  • 平均值法
  • 加权平均法(Y = 0.2126 R + 0.7152 G + 0.0722 B)
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;

/*
 * Y = 0.2126 R + 0.7152 G + 0.0722 B
 */

int main(int argc, const char* argv[]) {
	cv::Mat img = cv::imread("test.jpg", cv::IMREAD_COLOR);

	int width = img.rows;
	int height = img.cols;


	Mat out = Mat::zeros(width, height, CV_8UC1);

	for (int i = 0; i < out.rows; i++)
	{
		for (int j = 0; j < out.cols; j++)
		{
			out.at<uchar>(i, j) = float(img.at<Vec3b>(i, j)[0] * 0.0722) +
				float(img.at<Vec3b>(i, j)[1] * 0.7152) +
				float(img.at<Vec3b>(i, j)[2] * 0.2126);
		}
	}

	cv::imshow("answer", out);
	cv::waitKey(0);
	cv::destroyAllWindows();
	system("pause");

	return 0;

}

注意at(函数中的类型区别)
在这里插入图片描述

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat img = imread("C:\\Users\\MSI-NB\\Desktop\\test1.jpg", cv::IMREAD_COLOR);
	// unsigned char r_c = img.at<uchar>(1, 1);
	std::cout << "unchar:"<< int(img.at<uchar>(2, 2))<< endl;
	std::cout << "Vec3b:"<<img.at<Vec3b>(2, 2)<< endl;

	system("pause");
}

3.大津二值化算法

参考链接一
参考链接二

otsu 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值。

方差越大,相关性越低,黑白越分明。

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void show_pic(cv::String winname, cv::Mat mat);

int main(int argc, char* argv[])
{
	//导入图像
	Mat img = imread("test.jpg", IMREAD_COLOR);

	int width = img.rows;
	int height = img.cols;

	//定义0图
	Mat gray = Mat::zeros(width, height, CV_8UC1);

	show_pic("original_gray", gray);

	//灰度化
	for (int i = 0; i < width; ++i)
	{
		for (int j = 0; j < height; ++j)
		{
			gray.at<uchar>(i, j) = float(img.at<Vec3b>(i, j)[0] * 0.0722) + float(img.at<Vec3b>(i, j)[1] * 0.7152) + float(img.at<Vec3b>(i, j)[2] * 0.2126);
		}

	}

	show_pic("gray", gray);

	//阈值确定
	double w0 = 0, w1 = 0;
	double m0 = 0, m1 = 0;
	double max_sb = 0, sb = 0;

	int th = 0;

	int val = 0;

	for (int t = 0; t < 255; ++t)
	{
		w0 = 0;
		w1 = 0;
		m0 = 0;
		m1 = 0;
		for (int i = 0; i < width; ++i)
		{
			for (int j = 0; j < height; ++j)
			{
				val = gray.at<uchar>(i, j);
				if (val < t)
				{
					w0++;
					m0 += val;
				}
				else
				{
					w1++;
					m1 += val;
				}
			}


		}

		m0 /= w0;
		m1 /= w1;

		w0 /= (height*width);
		w1 /= (height*width);
		sb = w0*w1*pow((m0 - m1), 2);

		if (sb > max_sb)
		{
			max_sb = sb;
			th = t;
		}
	}

	for (int i = 0; i < width; ++i)
	{
		for (int j = 0; j < height; ++j)
		{
			val = gray.at<uchar>(i, j);
			if (val < th)
			{
				val = 0;
			}
			else
			{
				val = 255;
			}
			gray.at<uchar>(i, j) = val;
		}
	}

	show_pic("Otsu", gray);

	system("pause");
	return 0;

}




4.二值化
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void show_pic(cv::String winname, cv::Mat mat);

int main(int argc, char* argv[])
{
	Mat img = imread("test.jpg", IMREAD_COLOR);

	int width = img.rows;
	int height = img.cols;
	int th = 128;

	Mat gray = Mat::zeros(width, height, CV_8UC1);

	show_pic("gray", gray);

	for (int i = 0; i < width; ++i)
	{
		for (int j = 0; j < height; ++j)
		{
			unsigned char tmp = img.at<Vec3b>(i, j)[0] * 0.0722 + img.at<Vec3b>(i, j)[0] * 0.7152 + img.at<Vec3b>(i, j)[2] * 0.2126;

			if (tmp<128)
			{
				gray.at<uchar>(i, j) = 0;
			}else
			{
				gray.at<uchar>(i, j) = 255;
			}
		}
	}

	show_pic("threhold", gray);

	return 0;
}


5.HSV变换

HSV 变换就是HSV色彩和RGB色彩之间可以互相转换。

HSV 即使用色相(Hue)、饱和度(Saturation)、明度(Value)来表示色彩的一种方式。


6.减色处理
val = {  32  (  0 <= val <  64)
         96  ( 64 <= val < 128)
        160  (128 <= val < 192)
        224  (192 <= val < 256)
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>

using namespace std;
using namespace cv;

void show_pic(cv::String winname, cv::Mat mat);

int main(int argc, char* argv[])
{
	Mat img = imread("test.jpg", IMREAD_COLOR);
	int width = img.rows;
	int height = img.cols;

	Mat out = Mat::zeros(width, height, CV_8UC3);

	for (int i = 0; i < width; ++i)
	{
		for (int j = 0; j < height; ++j)
		{
			for (int c = 0; c < 3; ++c)
			{
				out.at<Vec3b>(i, j)[c] = floor((double)img.at<cv::Vec3b>(i, j)[c] / 64) * 64 + 32;
			}
		}
	}
	show_pic("out", out);
	system("pause");
	return 0;
}


7.均值池化
#include <imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void show_pic(cv::String winname, cv::Mat mat);

int main(int argc, char* argv[])
{
	Mat img = imread("test.jpg", IMREAD_COLOR);
	show_pic("img", img);

	int width = img.rows;
	int height = img.cols;

	int stride = 8;
	double v = 0;

	if (width%stride != 0 || height%stride != 0)
	{
		width += (width%stride);
		height += (height%stride);

	}

	// Size size = Size(width, height);
	Size size = Size(height, width);
	resize(img, img, size);
	show_pic("img", img);

	Mat out = Mat::zeros(width, height, CV_8UC3);
	show_pic("out", out);

	for (int i = 0; i < width; i += stride)
	{
		for (int j = 0; j < height; j += stride)
		{
			for (int c = 0; c < 3; ++c)
			{
				v = 0;
				for (int _i = 0; _i < stride; ++_i)
				{
					for (int _j = 0; _j < stride; ++_j)
					{
						v += img.at<Vec3b>(i + _i, j + _j)[c];
					}
				}
				v /= (stride*stride);
				// std::cout << v << endl;
				for (int _i = 0; _i < stride; ++_i)
				{
					for (int _j = 0; _j < stride; ++_j)
					{
						out.at<Vec3b>(i + _i, j + _j)[c] = v;
					}
				}
			}
		}
	}

	show_pic("out", out);

	// for (int i = 0; i < width - stride; i += stride)
	// {
	// 	for (int j = 0; j < height - stride; j += stride)
	// 	{
	// 		for (int c = 0; c < 3; ++c)
	// 		{
	// 			v = 0;
	// 			for (int _i = 0; _i < stride; ++_i)
	// 			{
	// 				for (int _j = 0; _j < stride; ++_j)
	// 				{
	// 					v += img.at<Vec3b>(i + _i, j + _j)[c];
	// 				}
	// 			}
	// 			v /= (stride*stride);
	// 			// std::cout << v << endl;
	// 			for (int _i = 0; _i < stride; ++_i)
	// 			{
	// 				for (int _j = 0; _j < stride; ++_j)
	// 				{
	// 					out.at<Vec3b>(i + _i, j + _j)[c] = v;
	// 				}
	// 			}
	// 		}
	// 	}
	// }
	//
	// show_pic("out", out);

}


8.最大池化
#include <imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void show_pic(cv::String winname, cv::Mat mat);

int main8(int argc, char* argv[])
{
	Mat img = imread("test.jpg", IMREAD_COLOR);
	show_pic("img", img);

	int width = img.rows;
	int height = img.cols;

	int stride = 8;
	double v = 0;

	if (width%stride != 0 || height%stride != 0)
	{
		width += (width%stride);
		height += (height%stride);

	}

	Size size = Size(height, width); //h,w
	resize(img, img, size);
	show_pic("img", img);

	Mat out = Mat::zeros(width, height, CV_8UC3);
	show_pic("out", out);

	for (int i = 0; i < width; i += stride)
	{
		for (int j = 0; j < height; j += stride)
		{
			for (int c = 0; c < 3; ++c)
			{
				v = 0;
				for (int _i = 0; _i < stride; ++_i)
				{
					for (int _j = 0; _j < stride; ++_j)
					{
						v = img.at<Vec3b>(i + _i, j + _j)[c] > v ? img.at<Vec3b>(i + _i, j + _j)[c] : v;
					}
				}
				for (int _i = 0; _i < stride; ++_i)
				{
					for (int _j = 0; _j < stride; ++_j)
					{
						out.at<Vec3b>(i + _i, j + _j)[c] = v;
					}
				}
			}
		}
	}
	show_pic("out", out);
	return 0;
}

c++下使用opencv部署yolov5模型 (DNN) yoyov5-6部署,懂得都懂, c++下使用opencv部署yolov5模型 (DNN) 参考网址下载或者自己cmake opencv文件 立即下载

相关推荐

如何用OpenCV训练自己的分类器

详细介绍了怎样训练自己的分类器,用于图像识别和跟踪,对于初学者很有帮助

利用opencv源码和vs编程序训练分类器haartraining.cpp

如需转载请注明本博网址:http://blog.youkuaiyun.com/ding977921830?viewmode=contents。 一  训练框架 训练人脸检测分类器需要三个步骤: (1) 准备正负样本集,分别放到两个文件夹里。我使用的是麻省理工的那个人脸库,大家可以网上搜一下。 (2)把正样本集生成正样本描述文件(*.vec),把负样本集生成负样本集合文件。具体怎么操作请参考我博客中

迷途中的前进 2567

opencv训练分类器总结与疑问

如何利用opencv训练自己的分类器,内有多篇资料

Opencv + C++ 快速上手练习

Opencv + C++ 上手练习 一:图像显示 #include <opencv2/opencv.hpp> using namespace cv; int main(){ Mat image = imread("face_10.jpg"); imshow("显示",image); waitKey(0); return 0; } 运行结果: 二:图像腐蚀: #include <opencv2/opencv.hpp> using namespace c

m0_37796039的博客 855

opencv+VC图像处理学习例子

平台:opencv1.0+VC6.0 包含图像打开、边缘检测、人脸识别,图片缩放、贝塞尔曲线等例子,全部调试通过,非常适合初学者

【全开源】旅行吧旅游门票预订系统源码(FastAdmin+ThinkPHP+Uniapp)

此外,系统还会根据我的旅行计划和喜好,为我推荐合适的景点和门票,让我的旅行更加丰富多彩。旅游门票预订系统的出现,不仅简化了门票预订的流程,还提高了旅行的便捷性和效率。一款基于FastAdmin+ThinkPHP+Uniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。如今,有了旅游门票预订系统,这些问题都能迎刃而解。智能推荐:系统还会根据你的旅行计划和喜好,为你推荐合适的景点和门票,让你的旅行更加丰富多彩。

2401_84413757的博客 1302

opencv实例训练器traincascade源码学习-------traincascade.cpp解析

1 #include "opencv2/core.hpp" 2 #include "cascadeclassifier.h" 3 4 using namespace std; 5 using namespace cv; 6 7 int main( int argc, char* argv[] ) 8 { 9 //默认初始...

weixin_30879169的博客 181

UE5 Compute Shader实战:从基础到高级应用全解析

本文全面解析了在UE5中应用Compute Shader的完整流程,从基础概念、环境搭建到核心机制与实战应用。详细介绍了如何通过参数传递、线程派遣与数据读写实现GPU并行计算,并深入探讨了GPU粒子模拟、性能优化及结合光线追踪等高级应用场景,为开发者掌握UE5高性能计算提供系统指导。

yhn45678901的博客 502

【Yolov8 Opencv C++系列保姆教程】Yolov8 opencv c++ 版本保姆教程,Yolov8训练自己的数据集,实现红绿灯识别及红绿灯故障检测 ,红绿灯故障识别。

Yolov8 Opencv C++系列保姆教程,通过一个红绿灯识别的案例,实现了Yolov8 的应用全流程的过程,整个算法最终只依赖了opencv,部署会更加方便、易用。 基于Yolov8训练自己的数据集,实现红绿灯识别及红绿灯故障检测 ,红绿灯故障识别。

zhulong1984的博客 9239

别再只接个放大器了!压电传感器测量电路(电压/电荷放大器)的5个实战配置要点

本文深入解析压电传感器测量电路中的5个关键实战配置要点,包括电缆长度选择、输入阻抗匹配、过载保护设计、低频噪声抑制及放大器选型策略。特别针对电压放大器和电荷放大器的应用场景差异提供工程实践建议,帮助工程师有效解决信号失真、噪声干扰等常见问题,提升测量精度和系统可靠性。

weixin_26869081的博客 302

PMF5.0计算

EPA PMF5.0 计算步骤

nuistsy的博客 4546

c++_opencv的人脸识别起步三训练自己的模型

1、Creating the CSV File 照片需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。 /path/to/image.ext;0假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个照片的名字,所以同一张的照片的标签都一样。 ...

北巷番茄鱼的博客 3155

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 287

openCV练习代码(C++版本)

1、简单的读取和显示图片 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main(int argc,char** argv){ Mat src = imread("F:/images/zwj.jpg"); //读取图片 if (src.empty()) { //判断是否找到图片 printf("

猪猪侠 1万+

Redmi K30 5G刷 LineageOS17.1

前言 买手机前就观望了Xdr论坛,看Redmi K30 5G有LineageOS17.1的Rom并且还挺热,应该还不错,就入手了。晚上就刷机了。买了小米就是为了折腾,为发烧而生。 在开始前还请先安装adb工具,因为我自己是做Android开发的,自带adb,不会安装的可以百度“Android安装adb工具”。还有下载刷机文件:百度云 密码:2a0f 刷机的系统是刚买来的低版本,没有升级过Rom,如果高版本慎刷。 还有这个Rom是5G版本的,4G版本的不要刷。 建议没有刷过机器的最好不要尝试,变砖后果自负。

u010436867的博客 1万+

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

采用软核进行串口升级的原因主要有以下几点:1、官方推荐:官方以前也推出了针对逻辑进行升级的程序《XAPP1081_QuickBoot》,但是从今年起(2024年)官方就停止更新相关例程了(详见下面截图),所以采用官方推荐的软核更新;2、简单并具有通用性:针对SPI或者BPI官方都有相关的IP,可应对市场上80%以上的FLASH,并且官方IP通用性极强,只需要修改几个参数就可以对不同厂家的芯片进行升级操作;

OpenFPGA的博客 2001

CPP----opencv练习

opencv练习(C++)

writ的博客 323

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2606

基于C++的opencv练习凸包点

#include<iostream> #include<opencv2/opencv.hpp> #include<string> using namespace std; using namespace cv; int main() {  Mat image(600, 600, CV_8UC3);  RNG& rng = theRNG...

weixin_43474255的博客 452

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

基于C++的opencv练习findcontours 过程

#include<iostream> #include<opencv2/opencv.hpp> #include<string> using namespace std; using namespace cv; int main() {  Mat img = imread("contours.jpg");//边界线在绘制的时候是使用3通道rgb绘制的所...

weixin_43474255的博客 1723

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于C++的opencv练习 仿射变换

#include <opencv2\opencv.hpp> #include <iostream> #include <math.h> #include <vector> using namespace cv; using namespace std; int main() {  Point2f srcTriangle[3];  ...

weixin_43474255的博客 570

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于C++的opencv练习最小外接矩形minAreaRect

#include<iostream> #include<opencv2/opencv.hpp> #include<string> using namespace std; using namespace cv; int main() {  Mat image(600, 600, CV_8UC3);  RNG& rng = theRNG...

weixin_43474255的博客 2501

基于C++的opencv练习三颜色通道分离

#include <opencv2\opencv.hpp> #include <iostream> #include <math.h> #include <vector> using namespace cv; using namespace std; int main() {  vector<Mat> channels; &n...

weixin_43474255的博客 818

基于C++的opencv练习,霍夫变换

#include <opencv2\opencv.hpp> #include <iostream> #include <math.h> #include <vector> using namespace cv; using namespace std; int main() {  Mat src = imread("test1.jpg",1...

weixin_43474255的博客 226

C++ OpenCV透视变换综合练习

学更好的别人,做更好的自己。——《微卡智享》本文长度为3879字,预计阅读9分钟前言以前的文章《C++ OpenCV之透视变换》介绍过透视变换,当时主要是自己固定的变换坐标点,所以在想可...

Vaccae的博客 1221

C++ opencv打开摄像头小练习

#include&lt;opencv2/opencv.hpp&gt; #include&lt;Windows.h&gt; using namespace std; using namespace cv; int main() { VideoCapture cam(0); UMat frame; cam &gt;&gt; frame; for (; waitKey(1) != 27; ...

wwxy1995的博客 2982
上一篇: Ubuntu下的U盘启动器制作
下一篇: 记录使用Tensorflow的一些问题
DeepLearningJay
博客等级 码龄7年 3064粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值