上位机图像处理和嵌入式模块部署(自定义算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

我们在使用opencv的时候,虽然大部分算法都不需要我们自己重头开始编写,但是总有一些关于我们自己产品的know-how,是之前库里本来就不存在的。所以,这个时候,我们还是希望能够借助于opencv实现一些自定义的算法,这样可以满足客户个性化的需求,也可以提高自己的竞争力。另外,即使是opencv库里面已经有的算法,由于它本身面对的是通用平台,因此很难对相关代码进行专门的硬件优化,所以即使是已经存在的算法,有的时候还是需要重新写一遍,出一个针对专门硬件的加速版本,这都是常有的事情。

1、复用之前的opencv部署步骤

一开始,我们还是需要创建一个console工程、配置好include目录、配置好lib目录、拷贝好必要的dll文件、准备好测试图片,这些都是少不了的。由于这些内容之前都已经谈到过,所以,这里不再赘述。

2、编写自定义函数

编写自定义函数的核心主要有三个,第一,相关的数据结构是什么?很明显,在opencv下面,数据的保存方式就是cv::Mat。第二,怎么获取像素值?一般来说,直接使用image.at<uchar>(i,j)的方式,就可以获得像素值。第三,怎么设置像素值,做法和第二点一样,不同的是前面是读取,这个直接赋值给它即可。所以,如果我们需要用它来写一个简单的二值化函数,一般可以这么来做,

#include <opencv2/opencv.hpp>
#include <iostream>

// self defined image processing function
void customThreshold(const cv::Mat& inputImage, cv::Mat& outputImage, int thresholdValue) 
{
	// make sure this is single channel 
	CV_Assert(inputImage.channels() == 1);

	// copy image
	outputImage = inputImage.clone();

	// loop to check each pixel
	for (int i = 0; i < outputImage.rows; ++i) 
	{
		for (int j = 0; j < outputImage.cols; ++j) 
		{
			// get value
			uchar pixelValue = outputImage.at<uchar>(i, j);

			// set value
			outputImage.at<uchar>(i, j) = (pixelValue > thresholdValue) ? 255 : 0;
		}
	}
}

3、补充完剩余的图像处理代码

仅仅有customThreshold函数还是不够的,整个项目要想运行起来,还需要读取图片文件、保存图片文件、显示图片文件等内容。所以,我们继续把相关的代码补上即可,

// file starts here
int main() 
{
	// read image
	cv::Mat image = cv::imread("D:/lena.png");

	// check if image has been loaded successfully
	if (image.empty()) 
	{
		std::cout << "unable to load image here" << std::endl;
		return -1;
	}

	// transfer image to gray type
	cv::Mat grayImage;
	cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

	// transfer gray image to binary image
	cv::Mat binaryImage;
	customThreshold(grayImage, binaryImage, 110);

	// show binary image
	cv::imshow("Binary Image", binaryImage);

	// wait for input
	cv::waitKey(0);
	return 0;
}

首先,还是和以前一样,通过cv::imread的方法读取图片。接着判断图片是否为空。判断结束后,先是把image转成grayImage,然后把grayImage继续转成binaryImage,最后显示binaryImage即可。当然,这里会调用一下cv::waitKey,没有按键输入的话,图片窗口会一直处于显示状态。

4、编译和测试

编译的话,主要看编译有没有出错、链接有没有出错、运行有没有出错,如果这几个部分都没有问题,那说明我们前面设置的环境都是ok的。这样,只需要看显示的图片有没有变成二值化即可。另外,也说明我们在完全没有借助opencv api的情况下,自己实现了一个自定义函数,这在后续的产品开发中是非常有用的。

相关推荐
公众号Codewar原创作者13 分钟前
R数据分析:工具变量回归的做法和解释,实例解析
开发语言·人工智能·python
IT古董28 分钟前
【漫话机器学习系列】020.正则化强度的倒数C(Inverse of regularization strength)
人工智能·机器学习
进击的小小学生31 分钟前
机器学习连载
人工智能·机器学习
Trouvaille ~42 分钟前
【机器学习】从流动到恒常,无穷中归一:积分的数学诗意
人工智能·python·机器学习·ai·数据分析·matplotlib·微积分
dundunmm1 小时前
论文阅读:Deep Fusion Clustering Network With Reliable Structure Preservation
论文阅读·人工智能·数据挖掘·聚类·深度聚类·图聚类
szxinmai主板定制专家1 小时前
【国产NI替代】基于FPGA的4通道电压 250M采样终端边缘计算采集板卡,主控支持龙芯/飞腾
人工智能·边缘计算
是十一月末1 小时前
Opencv实现图像的腐蚀、膨胀及开、闭运算
人工智能·python·opencv·计算机视觉
云空1 小时前
《探索PyTorch计算机视觉:原理、应用与实践》
人工智能·pytorch·python·深度学习·计算机视觉
杭杭爸爸1 小时前
无人直播源码
人工智能·语音识别
Ainnle2 小时前
微软 CEO 萨提亚・纳德拉:回顾过去十年,展望 AI 时代的战略布局
人工智能·microsoft