opencv - gray

nahye·2021년 5월 7일
0

영상처리
1. 직접 데이터 접근 (C++) -> 자바, C#
2. 있는 라이브러리 활용(딥러닝 세계)
둘 다 고전적 영상처리


실제 메모리의 크기는 9byte

접근할 수 있는 포인터를 가져오고


포인터 값을 획득하는 것

row[x] = x; 대신 data[y * ws +x]=x;도 가능
근데 row포인터를 새로 만드는게 빠르긴 함

row에 값을 집어 넣을 때 최적화를 위해 y와 x값을 살려줘야함
여기서 for문 한 번만 쓰는 것도 가능
x에 본인이 원하는 영상처리를 집어 넣으면 됨

8bit는 0~255까지 저장할 수 있는데
256 이상부터 저장하면 overflow가 일어남
overflow를 컴공으로 풀어보면
256 -> 0 x 0100
257 -> 0 x 0101

#include <opencv2/opencv.hpp>

void fill_grad(cv::Mat dst)
{
	int width = dst.cols;
	int height = dst.rows;
	
	unsigned char* data = dst.data;
    // data 행렬에 대한 포인터 값을 받아올 수 있음

	int ws = dst.step1();
    // step은 width와 똑같은 값 가짐

	for (int y = 0; y < height; y++)
	{
		unsigned char* row = data + y * ws;
		for (int x = 0; x < width; x++)
		{
			row[x] = x;
		}
	}
}

void alpha_mix(cv::Mat src, cv::Mat dst, double alpha = 0.5)
{
	int width = dst.cols;
	int height = dst.rows;
    
    // src와 dst가 같아야함
    if(src.cols != dst || src.rows != dst.rows)
    {
    }

	unsigned char* srcData = src.data;
	unsigned char* dstData = dst.data;

	int ws = dst.step1();

	for (int y = 0; y < height; y++)
	{
		for (int x = 0; x < width; x++)
		{
        	
			dstData[y * ws + x] =
				(1 - alpha) * dstData[y * ws + x]
				+ alpha * srcData[y * ws + x];
		}
	}
}

void add(cv::Mat src, cv::Mat dst)
{
	int width = dst.cols;
	int height = dst.rows;

	unsigned char* srcData = src.data;
	unsigned char* dstData = dst.data;

	int ws = dst.step1();

	int size = width * height;

	/*for (int i = 0; i < size; i++)
	{
		dstData[i] += srcData[i];
	}*/

	unsigned char* srcDataEnd = srcData + size;
	for (; srcData < srcDataEnd; srcData++, dstData++)
	{
		*dstData += *srcData;
	}
}

//threshold???


//(python)import numby as np
//= (c)np::zeros



//(python) class Mat:
				def _init_(self, rows, cols, type):
//=(c)def -init-(int self, int rows, int cols):
		pass
//=(c)def -init-(float self, float rows, float cols):
		pass
// int받는 거, float 만든 거 따로 해줘야함




int main()
{
	cv::Mat mat(256, 256, CV_8UC1); 
	//fill_grad(mat);
	cv::imshow("fill_grad", mat);
   //imshow와 waitKey는 항상 같이 써야함, show만 하면 퍼포먼스가 할당이 안 됨
	cv::waitKey(0); //시간 입력, 0은 무한히 기다리는 거, 화면에 띄워줄 수 있는 시간을 벌어줌

	cv::Mat mat2 = cv::Mat::zeros(256, 256, CV_8UC1);
	alpha_mix(mat, mat2);
	cv::imshow("alpha_mix", mat2);
	cv::waitKey(0);

	cv::Mat mat3 = cv::Mat::ones(256, 256, CV_8UC1) * 10;
	//mat3 += mat;
	add(mat, mat3);
	cv::imshow("add", mat3);
	cv::waitKey(0);
}

이전 프로그램이 썼던 데이터가 남아있는 경우가 쓰레기 값 보통 컴퓨터를 킬 때 랜덤 쓰레기 값이 적어져 있음

zeros : 다 0으로 초기화 시켜주자

profile
Slow and steady wins the race

0개의 댓글