颜色区域检测的功能实现
本文主要介绍如何使用vs2012新建一个c++项目实现预期的功能,代码具体实现结合了opencv的功能,因此设计到包含文件和库的配置。
代码实现的功能为将一种特定的颜色从一幅图中检测出来,并转化为二值图显示。
运行环境:
win7 64位系统
visual studio 2013(2012版也适用)
运行debug 32位(win32)
首先,打开vs2013,新建项目工程,工程名中英文皆可,中间为工程放置路径,可以自己选择,本文放置桌面。
上面之后直接下一步,到下面的情况下,选定**空项目**,然后完成工程建立。
右键源文件,添加一个主函数main.cpp,里面包含函数的具体实现代码。
在main.cpp里写入函数的实现部分,代码如下,直接拷贝进去。
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
Mat imgHSV;
Mat imgThresholded;
int iLowH = 20;
int iHighH = 35;
int iLowS = 80;
int iHighS = 255;
int iLowV = 80;
int iHighV = 255;
Mat imgOriginal = imread("666.jpg");
Mat src;
void on_track(int)
{
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
//开操作 (去除一些噪点)
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
//闭操作 (连接一些连通域)
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
imshow("Thresholded Image", imgThresholded); //show the thresholded image
imshow("原图",src);
//char key = (char) waitKey(300);
//imshow("Original", imgOriginal); //show the original image
///waitKey(0);
}
int main( int argc, char** argv )
{
//'VideoCapture cap(0); //capture the video from web cam
//if ( !cap.isOpened() ) // if not success, exit program
//{
// cout << "Cannot open the web cam" << endl;
// return -1;
//}
namedWindow("Control", CV_WINDOW_AUTOSIZE); //create a window called "Control"
//Create trackbars in "Control" window
cvCreateTrackbar("LowH", "Control", &iLowH, 179,on_track); //Hue (0 - 179)
cvCreateTrackbar("HighH", "Control", &iHighH, 179,on_track);
cvCreateTrackbar("LowS", "Control", &iLowS, 255,on_track); //Saturation (0 - 255)
cvCreateTrackbar("HighS", "Control", &iHighS, 255,on_track);
cvCreateTrackbar("LowV", "Control", &iLowV, 255,on_track); //Value (0 - 255)
cvCreateTrackbar("HighV", "Control", &iHighV, 255,on_track);
// while (true)
// {
//bool bSuccess = cap.read(imgOriginal); // read a new frame from video
// if (!bSuccess) //if not success, break loop
//{
// cout << "Cannot read a frame from video stream" << endl;
// break;
//}
resize(imgOriginal,src,Size(720,576));
vector<Mat> hsvSplit;
cvtColor(src, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做
split(imgHSV, hsvSplit);
equalizeHist(hsvSplit[2],hsvSplit[2]);
merge(hsvSplit,imgHSV);
on_track(iLowH); on_track(iHighH);
on_track(iLowS); on_track(iHighS);
on_track(iLowV); on_track(iHighV);
//inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
开操作 (去除一些噪点)
//Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
//morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
闭操作 (连接一些连通域)
//morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
//imshow("Thresholded Image", imgThresholded); //show the thresholded image
//waitKey(0);
//imshow("Original", imgOriginal); //show the original image
//waitKey(0);
waitKey(0);
// if(key == 27)
/// break;
// }
return 0;
}
到这一步,如果是基础的c++代码就可以直接f5运行了。由于本项目调用了opencv的库,所以要进行包含目录和库文件的配置。
此工程在main函数的当前路径下,存入了一个3rd的文件夹,里面包含了一个include和一个lib文件夹。
其中include里位opencv的头文件,lib中为代码运行中对opencv的依赖库文件opencv_x249d.lib;
这里的x为具体lib名,249为opencv的版本号,d为后缀,是debug模式下的依赖库。
在把需要的头文件和库具体放进工程之后,下一步是将工程需要用到的包含文件目录和库文件目录配置好,并且具体给出所需要的lib文件名称。
右键项目,打开属性,这里如果之前电脑用过opencv并且配置过的话,可能这里会有两个绝对路径,就是指项目在电脑里寻找这两个路径及文件。
这种配置方法可以使下次用到opencv库时不用重新配置,缺点是如果将整个工程换到其他电脑上时无法使用,仍需配置。
这里讲第二种配置的方法,给出的路径为当前工程路径,可用性较强。
打开项目属性,找到对应包含目录和库目录,编辑输入上面操作中文件存放的位置。
找到链接器里的输入,编辑,将调用的库名称写进去,让工程能具体找到对应需要的库。
配置完成后,点击应用,这时候之前的红色波浪号报错应该会消失,然后就可以进行最后的编译连接运行代码了,直接f5一键搞定,代码无误,运行结果如下:
到此为止,基本工程的建立使用结束,下一篇将介绍如何将几个文件代码组合实现的功能封装成一个库(提供头文件与lib文件),以供别人使用,在具体项目中用处较大。