颜色缩减(带Trackbar)【从毛星云Opencv3编程入门P75 P111例程改编】
最近学了点opencv,买了毛星云的书,大力推荐哦。
颜色缩减,自己加了个Trackbar看起来更直观一些。
我一般自己先看一遍程序,脑子里有个大概印象了,再自己写一遍,这样出了错误会印象更深刻。
1. Mat.type( )括号不能丢
2. Mat.channels()括号不能丢
3.创建Trackbar的函数createTrackbar(TrackbarName, WINDOWNAMAE, &sliderValue, maxSliderValue,onTrackbar);
这里onTrackbar是一个回调函数,写在creatTrackbar里时,不用()
在写这个函数时,是要加括号的,调用时候也是哦,
onTrackbar(int , void*)
int 实slierValue,void* 填0貌似就可以了
4. 创建Trackbar之前,一定要
namedWindow(WINDOWNAME, 1);
如果没有此句,就不显示Trackbar,很重要哦 ,这里我犯了错。
char TrackbarName[50];
sprintf(TrackbarName, "颜色缩减值%d",divslider);
这句是用来显示滑动条上说明文字,还是加上比较好。
5. 自己画蛇添足地在onTrackbar 回调函数上加了个while(1),其实不用啦!
6. 颜色缩减函数很容易懂,就不说了。不过不太明白为啥要 data[j] = data[j] / div*div+div/2 这个div/2我不太懂。没有用div/2 也好用来着。
代码如下,要先在工程文件里有个“dota.jpg”
#include <opencv2/opencv.hpp> #include<highgui.hpp> using namespace cv; using namespace std; #define WINDOWNAME "dstImg" int maxdiv = 255; Mat dstImg,srcImg; int divslider; void colorReduce(Mat& src, Mat& dst, int div); void on_Trackbar(int ,void*); int main(){ divslider = 20; srcImg = imread("dota.jpg", 1); dstImg.create(srcImg.cols,srcImg.rows, srcImg.type()); imshow("srcImg", srcImg); namedWindow(WINDOWNAME, 1);//如果没有此句,就不显示Trackbar。 char TrackbarName[50]; sprintf(TrackbarName, "颜色缩减值%d",divslider); createTrackbar("reduce div", WINDOWNAME, &divslider, maxdiv, on_Trackbar); on_Trackbar(divslider, 0); waitKey(0); return 0; } void on_Trackbar(int, void*){ if (divslider > 0){ colorReduce(srcImg, dstImg, divslider); imshow(WINDOWNAME, dstImg); } } void colorReduce(Mat& src, Mat& dst, int div){ dst = src.clone(); int rowNum = dst.rows; int colNum = dst.cols * dst.channels(); for (int i = 0; i < rowNum; i++){ uchar* data = dst.ptr<uchar>(i); for (int j = 0; j < colNum; j++) data[j] = data[j] / div*div; } }