[Learning OpenCV 입문 3] OpenCV 데이터 구조 및 core 구성 요소

5098 단어
벡터 의 소개
	*【1】Vec---   OpenCv ---     (     )----     Vec        ,    “   ”--    Vec---     ,、
	*             "  "---      ---   
	*【2】Vec---           :
	*     template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
	*【3】       ,       “     ”,    :
	* 		1-- OpenCv     (vector)  ,        ,         (              ,        )
	*		2--OpenCv                     ,    ,            ,            --    
	*           , OpenCv     
	*【4】Vec<int,n>---     int             ,          .  ,     int--  Vec     int  ;  
	*        n      ,  Vec       n int ,   ---n   (   )
/【1】     Vec    ,        Vec       ---      
//【1】Vec2b--       --   ---                  :
//【1】Vec2b---    Vec2b   ,    2 char(   )  
typedef Vec<uchar, 2> Vec2b; 
//【2】Vec3b---     Vec3b   ,    3 char(   )  ,          ,   RGB    
//     
typedef Vec<uchar, 3> Vec3b;
//【3】Vec4b---     Vec4b   ,    4      ,            ---4  RGB+Alpha  
//      
typedef Vec<uchar, 4> Vec4b;

색 공간 변환
#include "stdafx.h"
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	Mat dstImage,srcImage = imread("1.jpg", 188);
	if (!srcImage.data )
	{
		cout << "       " << endl;
		return -1;
	}
	else
		cvtColor(srcImage, dstImage, COLOR_BGR2Lab);

	namedWindow("   ",WINDOW_AUTOSIZE);
	imshow("   ", dstImage);
	waitKey();
	return 0;
}

그림 의 픽 셀 에 접근 하 는 세 가지 방법 은 colorReduce 코드 를 교체 하면 실행 할 수 있 습 니 다.
포인터 접근
#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

void colorReduce(Mat& inputImage, Mat& outputImage, int div);
void ShowHelpText();


int _tmain(int argc, _TCHAR* argv[])
{
	ShowHelpText();

	Mat srcImage=imread("1.jpg"), dstImage;//     Mat 

	if (!srcImage.data){ cout << "           " << endl; return -1; }
	imshow("    ", srcImage);//              
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());

	double time0 = static_cast<double>(getTickCount());
	colorReduce(srcImage, dstImage, 32);//            
	time0 = ((double)getTickCount() - time0) / getTickFrequency();
	cout << "         : " << time0 << " "<<endl;
	imshow("        ", dstImage);
	waitKey();
	return 0;
}
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{//   Mat     
	//    
	outputImage = inputImage.clone();  //         
	int rowNumber = outputImage.rows;  //  
	int colNumber = outputImage.cols*outputImage.channels();  //   x    =        

	//    ,        
	for (int i = 0; i < rowNumber; i++)  //   
	{
		uchar* data = outputImage.ptr<uchar>(i);  //   i     
		for (int j = 0; j < colNumber; j++)   //   
		{
			// ---------【        】-------------     
			data[j] = data[j] / div*div + div / 2;
			//ptr               
			//ptr     
			// ----------【    】---------------------
		}  //     
	}
}
void ShowHelpText()
{
	cout << "

\t\t\t
"; cout << "

\t\t\tOpenCV " << CV_VERSION << endl; cout << "---------------------------- -----------------" << endl; }

교체 기 를 사용 하여 픽 셀 을 조작 합 니 다. STL 방법 과 유사 합 니 다. begin 과 end 만 가 져 오 면 됩 니 다. 세 개의 채널 이기 때문에 다음 세 가지 처 리 를 사용 합 니 다.
void colorReduce(Mat& inputImage, Mat& outputImage, int div)  
{  
	//    
	outputImage = inputImage.clone();  //         
	//     
	Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();  //        
	Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();  //        

	//        
	for(;it != itend;++it)  
	{  
		// ------------------------【        】--------------------
		(*it)[0] = (*it)[0]/div*div + div/2;  
		(*it)[1] = (*it)[1]/div*div + div/2;  
		(*it)[2] = (*it)[2]/div*div + div/2;  
		// ------------------------【    】----------------------------
	}  
}

동적 주소 로 계산 하 는 방법 으로 픽 셀 조작: at 구성원 함수 로 주 소 를 가 져 옵 니 다.
void colorReduce(Mat& inputImage, Mat& outputImage, int div)  
{  
	//    
	outputImage = inputImage.clone();  //         
	int rowNumber = outputImage.rows;  //  
	int colNumber = outputImage.cols;  //  

	//        
	for(int i = 0;i < rowNumber;i++)  
	{  
		for(int j = 0;j < colNumber;j++)  
		{  	
			// ------------------------【        】--------------------
			outputImage.at<Vec3b>(i,j)[0] =  outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;  //    
			outputImage.at<Vec3b>(i,j)[1] =  outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;  //    
			outputImage.at<Vec3b>(i,j)[2] =  outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;  //    
			// -------------------------【    】----------------------------
		}  //           
	}  
}  

좋은 웹페이지 즐겨찾기