颜色缩减(带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;
	}
}


posted @ 2015-08-16 16:47  xy123001  阅读(518)  评论(0编辑  收藏  举报