最近学了点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;
}
}