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


  • 相关阅读:
    windows下多个python版本共存,删掉一个
    解决ModuleNotFoundError: No module named 'pip'问题
    Palindrome Linked List 综合了反转链表和快慢指针的解法
    30-Day Leetcoding Challenge Day9
    Longest Common Prefix 五种解法(JAVA)
    30-Day Leetcoding Challenge Day8
    30-Day Leetcoding Challenge Day7
    30-Day Leetcoding Challenge Day6
    30-Day Leetcoding Challenge Day2
    leetcode162 Find Peak Element
  • 原文地址:https://www.cnblogs.com/xy123001/p/5218659.html
Copyright © 2020-2023  润新知