[Learning OpenCV 입문 3] OpenCV 데이터 구조 및 core 구성 요소
*【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; //
// -------------------------【 】----------------------------
} //
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.