当前位置:伍佰目录 » 站长资讯 » 免费资源 » 技术文章 » 文章详细

openCV练习代码(C语言版本)

来源:本站原创 浏览:481次 时间:2021-05-19

1、opencv简单的读取和显示图片

如果不设置imread的读入参数,默认读入的为彩色图片

#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv){Mat src = imread("F:/images/zwj.jpg"); //读取图片if (src.empty()) {                     //判断是否找到图片printf("没有找到图片 ");           //输出文字return -1;}else{namedWindow("input",WINDOW_AUTOSIZE);// 显示窗口命名为input ;WINDOW_AUTOSIZE显示大小为图片自定义大小,且不可以更改大小imshow("input",src); //显示waitKey(0);//显示的毫秒时间,如果函数参数0表示显示的时间destroyAllWindows();return 0;}}

2、opencv加载一个灰度图像

只要设置imread的参数:IMREAD_GRAYSCALE(PS:彩色图像的参数为:IMREAD_ANYCOLOR)

 

3、 Mat创建方法
#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv){Mat src = imread("D:/Program Files/opencv/sources/samples/data/opencv-logo.png",IMREAD_GRAYSCALE);if(src.empty()){printf("没有此图片,请检查路径是否正确");return -1;}else{namedWindow("图片",WINDOW_AUTOSIZE);imshow("图片",src);int width = src.cols;//宽带int higth = src.rows;//高度int dim = src.channels();//查看维度int d = src.depth();//int t = src.type();//图像类型if(t==CV_8UC3){printf("width: %d|,higth : %d dim %d", width, higth, dim);printf("深度:%d,类型:%d", d, d);}//怎么创建Mat//创建方法一Mat t1 = Mat(256,256,CV_8UC3);t1 = Scalar(0,0,255);imshow("t1",t1);//创建方法二Mat t2 = Mat(512, 512, CV_8UC3);t2 = Scalar(255,0,255);imshow("t2",t2);//创建方法三Mat t3 = Mat::zeros(Size(256,256),CV_8UC3);//3 = Scalar(255,0,0);imshow("t3",t3);//创建方法四:复制克隆方法Mat t4 = src.clone();imshow("t4",t4);//创建方法五Mat t5 = Mat::zeros(src.size(), src.type());//创建一个和原图大小一样,类型一样的图imshow("t5", t5);waitKey(0);destroyAllWindows();return 0;}}

4、opencv如何遍历所有像素点

普通方法:基于数组遍历

//如何遍历访问所有Mat的像素值#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv){Mat src = imread("D:/Program Files/opencv/sources/samples/data/opencv-logo.png",IMREAD_GRAYSCALE);if (src.empty()) {printf("没找到图片,请检查路径");return -1;}else{namedWindow("图像",WINDOW_FREERATIO);imshow("图像",src);//遍历访问像素值//首先知道图像的长高int width = src.cols;int higth = src.rows;int dim = src.channels();for (int row = 0; row < higth;row++) {for (int col = 0; col < width;col++) {if (dim==3) {Vec3b pixel=src.at(row, col);//字节类型3通道的Vec3b,int 类型Vec3i获得int blue = pixel[0];int green = pixel[1];int red = pixel[2];src.at(row, col)[0] = 255 - blue;src.at(row, col)[1] = 255 - green;src.at(row, col)[2] = 255 - red;}else if(dim==1){int pv = src.at(row, col);//单通道的灰度是char类型src.at(row, col) = (255 - pv);}}}imshow("像素测试图像", src);waitKey(0);destroyAllWindows();return 0;}}

 

高级遍历方式:基于指针遍历方式 

//如何遍历访问所有Mat的像素值#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv){Mat src = imread("D:/Program Files/opencv/sources/samples/data/opencv-logo.png",IMREAD_ANYCOLOR);if (src.empty()) {printf("没找到图片,请检查路径");return -1;}else{namedWindow("图像",WINDOW_FREERATIO);imshow("图像",src);//遍历访问像素值//首先知道图像的长高int width = src.cols;int higth = src.rows;int dim = src.channels();//基于指针的遍历方式Mat result = Mat::zeros(src.size(),src.type());// 基于数组遍历方式for (int row = 0; row < higth;row++) {uchar*curr_row = src.ptr(row);//获取当前行的指针uchar*result_row = result.ptr(row);for (int col = 0; col < width;col++) {if (dim==3) {int blue = *curr_row++;int green = *curr_row++;int red = *curr_row++;*result_row++ = blue;*result_row+�����ֽ�,ҧ�Ľ���+ = green;*result_row++ = red;}else if(dim==1){int pv = *curr_row++;*result_row++ = pv;}}}imshow("像素测试图像", result);waitKey(0);destroyAllWindows();return 0;}}

5、opencv进行图像腐蚀和膨胀
#include#includeusing namespace std;using namespace cv;int main(int argc, char** argv) {Mat src = imread("D:/images/smarties.png"); //读取图片if (src.empty()) {                     //判断是否找到图片printf("没有找到图片 ");           //输出文字}else{namedWindow("原图", WINDOW_AUTOSIZE);// 显示窗口命名为input ;WINDOW_AUTOSIZE显示大小为图片自定义大小,且不可以更改大小imshow("原图", src); //显示Mat str1= getStructuringElement(MORPH_RECT,Size(50, 50));Mat fsImg;erode(src,fsImg,str1);imshow("腐蚀图像",fsImg);Mat str2 = getStructuringElement(MORPH_RECT, Size(20, 20));Mat pzImg;dilate(src, pzImg, str2);imshow("膨胀图像", pzImg);waitKey(0);//显示的毫秒时间,如果函数参数0表示显示的时间destroyAllWindows();return 0;}}

6、opencv均值滤波
#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv) {Mat src = imread("F:/images/zwj.jpg");if (src.empty()) {printf("没有找到图像,请检查路径是否正确");return -1;}else{//显示原图namedWindow("原图像",WINDOW_FREERATIO);imshow("原图像",src);//均值滤波Mat dstImg;blur(src,dstImg,Size(20,20));imshow("滤波后的图像",dstImg);waitKey(0);destroyAllWindows();return 0;}}

7、opencv边缘检测
#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv) {Mat src = imread("F:/images/zwj.jpg");if (src.empty()) {printf("未发现图像,请检查图片路径");return -1;}else {imshow("原图像",src);//边缘检测Mat dstImg, edge, grayImg;dstImg.create(src.size(), src.type());//创建一个和src同类型大小的图像cvtColor(src, grayImg, COLOR_BGR2GRAY);//降噪blur(grayImg,edge,Size(3,3));//边缘检测Canny(edge, edge, 3, 9, 3);//显示imshow("边缘检测图",edge);waitKey(0);destroyAllWindows();return 0;}}

 

8、opencv读取视频
#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv) {VideoCapture capture("D:/Program Files/opencv/sources/samples/data/vtest.avi");while (true){Mat frame;//定义一个Mat变量存储每一个帧图像capture >> frame;imshow("读取视频",frame);//显示当前帧数waitKey(30);//延时30ms}return 0;}

 

9、opencv对视频进行Canny边缘检测处理
#include#includeusing namespace std;using namespace cv;int main(int argc, char** argv) {VideoCapture capture("D:/Img/蔡徐坤.mp4");Mat edge;while (true){// 读取原图像Mat frame;//定义一个Mat变量存储每一个帧图像capture >> frame;//读取当前帧图片    //将原图像转换为灰度cvtColor(frame,edge,COLOR_BGR2GRAY);//转换为灰度图像    //滤波降噪处理blur(edge,edge,Size(7,7));//边缘检测Canny算子Canny(edge,edge,0,30,3);imshow("Canny边缘检测算子处理后的图像",edge);waitKey(1);//延时1ms}destroyAllWindows();return 0;}

10、opencv对图像进行加减乘除操作
#include#includeusing namespace std;using namespace cv;int main(int argc, int argv) {Mat src1 = imread("D:/Program Files/opencv/sources/samples/data/LinuxLogo.jpg");Mat src2= imread("D:/Program Files/opencv/sources/samples/data/WindowsLogo.jpg");if (src1.empty()&&src2.empty()) {printf("没有找到图像,请检查路径是否正确");return -1;}else{imshow("demo1", src1);imshow("demo2", src2);//代码演示Mat dst1;add(src1, src2,dst1);imshow("加法",dst1);//减法操作Mat dst2;subtract(src1, src2, dst2);imshow("减法", dst2);//乘法操作Mat dst3;    multiply(src1, src2, dst3);imshow("乘法", dst3);//除法操作Mat dst4;divide(src1, src2, dst4);imshow("除法操作", dst4);waitKey(0);destroyAllWindows();return 0;}}

 

 11、opencv调用摄像头
#include#include#include#include#includeusing namespace cv;using namespace std;int main(int, char**){Mat frame;VideoCapture cap;int deviceID = 0;  int apiID = 0;      cap.open(deviceID, apiID);while (true){cap.read(frame);if (frame.empty()) {cerr << "错误,空白帧\n";break;}imshow("调用摄像头", frame);waitKey(4);}return 0;}

12、opencv获取图像最大值像素点、最小值像素点、均值和方差
#include#includeusing namespace cv;using namespace std;int main(int argc,char** argv) {Mat src = imread("F:/images/zwj.jpg",IMREAD_GRAYSCALE);if (src.empty()) {printf("没有图片");return -1;}else {namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);int  w = src.cols;//宽int h = src.rows;//高int dim = src.channels();//维度printf("w:%d,h:%d,dim:%d\n",w,h,dim);//double min_val;double max_val;    Point maxloc;Point minloc;minMaxLoc(src,&min_val,&max_val,&minloc,&maxloc);//获取图像像素点的最大值和最小值,以及索引位置printf("min:%.2f,max:%.2f\n",min_val,max_val);//打印最大最小像素点printf("minX:%d,minY:%d  maxX:%d,maxY:%d\n",minloc.x, minloc.y, maxloc.x, maxloc.y);//打印最大最小像素点的位置//均值Scalar s = mean(src);printf("均值:%.2f\n",s[0]);//因为灰度是单通道的s[0],PS:彩色图像是三通道的s[0],s[1],s[2]//方差Mat mm,mstd;meanStdDev(src,mm,mstd);//均值和方差int rows = mstd.rows;int cols = mstd.cols;printf("rows:%d,cols:%d\n",rows,cols);printf("均值:%.3f,方差:%.3f\n",mm.at(0,0),mstd.at(0,0));waitKey(0);destroyAllWindows();return 0;}}

13、opencv画线、矩形、椭圆、圆形
#include#includeusing namespace cv;using namespace std;int main(int argc, char** argv) {Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);namedWindow("画布图像", WINDOW_AUTOSIZE);imshow("画布图像", canvas);//相关绘制//线line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),2,LINE_8);//画布、起、始点、颜色、线宽、渲染方式//矩形Rect rect(100,100,200,200);//绘制矩形rectangle(canvas,rect,Scalar(255,0,0),3,8);circle(canvas, Point(256, 256), 100, Scalar(0,255, 0),-3, 8);//画布、圆心、半径、颜色、线宽、渲染方式//椭圆RotatedRect rrt;rrt.center = Point2f(256,256);rrt.angle =CV_PI/4;// pi/4rrt.size=Size(100,200);ellipse(canvas, rrt, Scalar(0, 255, 255), -1, 8);//注:线宽<0则是填充图案imshow("画线段",canvas);waitKey(0);destroyAllWindows();return 0;}

 

 14、opencv分离图像通道
#include#includeusing namespace cv;using namespace std;int main(int argc, char** argv) {Mat src = imread("F:/images/zwj.jpg");if (src.empty()) {printf("没有图片");return -1;}else {namedWindow("原图", WINDOW_AUTOSIZE);vectormv;split(src,mv);//分离通道int size = mv.size();printf("通道数目:%d\n",size);//打印通道数目imshow("blue",mv[0]);//第一通道imshow("green:", mv[1]);//第二通道imshow("red", mv[2]);//第三通道mv[1] = Scalar(0);Mat dst;merge(mv,dst);//合并imshow("result",dst);imshow("原图", src);waitKey(0);destroyAllWindows();return 0;}}

 15、opencv好玩的代码:学了这么多觉得有点枯燥,做点新玩意

注意:因为opencv不支持中文,解决方案见:这位大佬的,把源码拷贝过来就行了

#include#include "putText.h"#includeusing namespace cv;using namespace std;int main(int argc, char** argv) {Mat image = Mat::zeros(Size(1000, 800), CV_8UC3);int row = image.rows;int col = image.cols;//提前声明坐标变量int x1 = 0, y1 = 0;RNG rng;while (true){x1 = (int)rng.uniform(0, col-1);y1 = (int)rng.uniform(0, row-1);//image = Scalar(0,0,0);putTextZH(image,"帅", Point(x1, y1),Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), rng.uniform(0,200),"宋体");imshow("别人都夸我帅", image);char c = waitKey(100);if (c == 27) {break;}}waitKey(0);destroyAllWindows();return 0;}

 

 

16、opencv绘制直方图
#include#includeusing namespace std;using namespace cv;int main(int argc,char** argv) {Mat src = imread("F:/images/zwj.jpg");if (src.empty()) {cout << "没有图片请 检查路径" << endl;return -1;}else{namedWindow("原图像",WINDOW_AUTOSIZE);imshow("原图像",src);vectormv;split(src,mv);//计算直方图int histSize = 256;Mat b_hist, g_hist, r_hist;float range[] = {0,255};const float* histRanges= { range};calcHist(&mv[0],1,0,Mat(),b_hist,1,&histSize,&histRanges,true,false);calcHist(&mv[1],1,0,Mat(),g_hist,1,&histSize,&histRanges,true, false);calcHist(&mv[2],1,0,Mat(),r_hist,1,&histSize,&histRanges,true, false);Mat result = Mat::zeros(Size(src.rows,src.cols),CV_8UC3);int margin = 50;int h = result.rows;int nm = result.rows - 2 * margin;normalize(b_hist ,b_hist, 0, nm, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, nm, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, nm, NORM_MINMAX, -1, Mat());float step = 500 / 256;for (int i = 0; i < 255; i++) {line(result, Point(step*i, 50 + (nm - b_hist.at(i, 0))), Point(step*(i + 1), 50 + (nm - b_hist.at(i + 1, 0))), Scalar(255, 0, 0), 2, 8, 0);line(result, Point(step*i, 50 + (nm - g_hist.at(i, 0))), Point(step*(i + 1), 50 + (nm - g_hist.at(i + 1, 0))), Scalar(0, 255, 0), 2, 8, 0);line(result, Point(step*i, 50 + (nm - r_hist.at(i, 0))), Point(step*(i + 1), 50 + (nm - r_hist.at(i + 1, 0))), Scalar(0, 0, 255), 2, 8, 0);}imshow("demo",result);waitKey(0);return 0;}}

17、openCV卷积操作 (根据原理写代码,openCV的卷积API为blur)
#include#includeusing namespace std;using namespace cv;int main(int argv,char** argc) {Mat src = imread("F:/images/zwj.jpg");if(src.empty()){cout << "没有找到图片,请检查路径是否正确" << endl;return -1;}namedWindow("原图",WINDOW_AUTOSIZE);imshow("原图",src);int w = src.cols;int h = src.rows;Mat result = src.clone();for ( int row = 1; row < w-1; row++){for (int col = 1; col < h-1; col++){//3*3的卷积核int sb = src.at(row, col)[0] + src.at(row - 1, col - 1)[0] + src.at(row - 1, col)[0] + src.at(row - 1, col + 1)[0] +src.at(row, col-1)[0]+ src.at(row, col+1)[0]+src.at(row+1, col-1)[0]+ src.at(row+1, col)[0]+ src.at(row+1, col+1)[0];int sg = src.at(row, col)[1] + src.at(row - 1, col - 1)[1] + src.at(row - 1, col)[1] +src.at(row - 1, col + 1)[1] + src.at(row, col - 1)[1] + src.at(row, col + 1)[1] +src.at(row + 1, col - 1)[1] + src.at(row + 1, col)[1] + src.at(row + 1, col + 1)[1];int sr = src.at(row, col)[2] + src.at(row - 1, col - 1)[2] + src.at(row - 1, col)[2] +src.at(row - 1, col + 1)[2] + src.at(row, col - 1)[2] + src.at(row, col + 1)[2] +src.at(row + 1, col - 1)[2] + src.at(row + 1, col)[2] + src.at(row + 1, col + 1)[2];result.at(row, col)[0] = sb/9 ;result.at(row, col)[1] = sg/9;result.at(row, col)[2] = sr/9;}}imshow("卷积",result);waitKey(0);destroyAllWindows();return 0;}


伍佰目录声明:本站部分文章来源于网络,版权属于原作者所有。如有转载或引用文章/图片涉及版权问题,请联系我们处理.我们将在第一时间删除! 联系邮箱:tsk@qq.com

快速链接

最新收录

最新点入