<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>one_step.log</title>
        <link>https://velog.io/</link>
        <description>데이터 사이언스 / just do it</description>
        <lastBuildDate>Fri, 12 Jan 2024 08:07:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>one_step.log</title>
            <url>https://velog.velcdn.com/images/one_step/profile/2a7dac52-bb4a-4763-a81d-6a569d235904/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. one_step.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/one_step" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SQL DML(SELECT)]]></title>
            <link>https://velog.io/@one_step/SQL-DMLSELECT</link>
            <guid>https://velog.io/@one_step/SQL-DMLSELECT</guid>
            <pubDate>Fri, 12 Jan 2024 08:07:37 GMT</pubDate>
            <description><![CDATA[<h2 id="select---데이터-조회">SELECT - 데이터 조회</h2>
<ul>
<li><code>WHERE</code> 조건: SQL 문에 조건을 추가하며 SELECT 뿐만 아니라 UPDATE 와 DELETE 에도 사용가능<pre><code class="language-sql"># 테이블 내의 특정 칼럼에 대한 데이터를 조회
SELECT column1, column2 FROM tablename;
</code></pre>
</li>
</ul>
<h1 id="테이블-내의-모든-컬럼에-대한-데이터를-조회">테이블 내의 모든 컬럼에 대한 데이터를 조회</h1>
<p>SELECT * FROM tablename;</p>
<h1 id="테이블-내에서-조건을-만족하는-데이터-조회">테이블 내에서 조건을 만족하는 데이터 조회</h1>
<p>SELECT column1, column2 FROM tablename WHERE condition;</p>
<pre><code>### 1) GROUP BY
- 그룹화하여 데이터를 조회
- ORDER BY 가능
```sql
SELECT column1, column2,..
FROM tablename
WHERE condition
GROUP BY column1, column2,..
ORDER BY column1, column2,..;

# crime_status 에서 경찰서별로 그룹화 하여 경찰서 이름을 조회
# DISTINCT와 비슷해보이지만 ORDER BY를 사용할 수 있다
SELECT police_station
FROM crime_status
GROUP BY police_station
ORDER BY police_station
LIMIT 5;

# 경찰서 별로 총 발생 범죄 건수를 검색
SELECT police_station, sum(case_number) 발생건수
FROM crime_status
WHERE status_type LIKE &#39;발생&#39;
GROUP BY police_station
ORDER BY 발생건수 DESC
LIMIT 5;</code></pre><table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/one_step/post/4d78ab85-192e-4464-aeda-3d5ebe9c787c/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/one_step/post/965006c1-2ed9-44d8-953d-3383804374db/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td>### 2) HAVING</td>
<td></td>
</tr>
<tr>
<td>- 조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 사용</td>
<td></td>
</tr>
<tr>
<td>```sql</td>
<td></td>
</tr>
<tr>
<td>SELECT column1, column2,..</td>
<td></td>
</tr>
<tr>
<td>FROM tablename</td>
<td></td>
</tr>
<tr>
<td>WHERE condition</td>
<td></td>
</tr>
<tr>
<td>GROUP BY column1, column2,..</td>
<td></td>
</tr>
<tr>
<td>HAVING condition (Aggregate Functions)</td>
<td></td>
</tr>
<tr>
<td>ORDER BY column1, column2,..;</td>
<td></td>
</tr>
</tbody></table>
<h1 id="경찰서-별로-발생한-범죄-건수의-합이-4000-건보다-보다-큰-경우를-검색">경찰서 별로 발생한 범죄 건수의 합이 4000 건보다 보다 큰 경우를 검색</h1>
<p>SELECT police_station, sum(case_number) 발생건수
FROM crime_status
WHERE status_type LIKE &#39;발생&#39;
GROUP BY police_station
HAVING 발생건수 &gt; 4000;</p>
<pre><code>### 3) ORDER BY
- SELECT 문에서 데이터를 특정 컬럼을 기준으로 오름차순 혹은 내림차순 정렬하여 조회
- ASC(Ascending): 오름차순으로 정렬
- DESC(Descending): 내림차순으로 정렬
- ASC를 생략해도 기본은 오름차순 정렬
```sql
SELET column1, column2 
FROM tablename 
ORDER BY column1, column2 asc | desc;

# celeb 테이블에서 이름과 나이를 나이의 역순으로 정렬한 뒤 이름순으로 정렬하여 조회
SELECT age, name FROM celeb
ORDER BY age DESC, name ASC;</code></pre><h3 id="4-concat">4) CONCAT</h3>
<ul>
<li>여러 문자열을 하나로 합치거나 연결<pre><code class="language-sql">SELECT CONCAT(&#39;string1&#39;, &#39;string2&#39;, ..);
SELECT CONCAT(&#39;이름: &#39;, name) FROM celeb;</code></pre>
<h3 id="5-alias">5) ALIAS</h3>
</li>
<li>칼럼이나 테이블 이름에 별칭 생성</li>
<li>AS는 생략도 가능<pre><code class="language-sql">SELECT column AS alias FROM tablename;
SELECT column1, column2 FROM tablename AS alias;
</code></pre>
</li>
</ul>
<p>SELECT name AS &#39;이름&#39;, agency AS &#39;소속사&#39; FROM celeb;
SELECT CONCAT(name, &#39; : &#39;, job_title) AS profile FROM celeb;</p>
<pre><code>- snl_korea 에 출연한 celeb 을 기준으로 두 테이블을 조인하여 다음과 같이 각 데이터의 별칭을 사용하여 검색
  - 시즌, 에피소드, 방송일을 합쳐서 ‘방송정보’
  - 이름, 직업을 합쳐서 ‘출연자정보’
```sql
SELECT CONCAT(s.season, &#39;-&#39;, s.episode, &#39;(&#39;, s.broadcast_date, &#39;)&#39;) &#39;방송정보&#39;,
    CONCAT(c.name, &#39;(&#39;, c.job_title, &#39;)&#39;) &#39;출연정보&#39;
FROM celeb c, snl_show s
WHERE c.name= s.host;</code></pre><h3 id="6-distinct">6) DISTINCT</h3>
<ul>
<li>검색한 결과의 중복 제거</li>
<li>ORDER BY 를 사용할 수 없음<pre><code class="language-sql">SELECT DISTINCT column1, column2.. FROM tablename;
</code></pre>
</li>
</ul>
<p>SELECT DISTINCT sex, agency FROM celeb WHERE agency LIKE &#39;%엔터테이먼트&#39; ORDER BY sex, agency;</p>
<pre><code>### 7) LIMIT
- 검색결과를 정렬된 순으로 주어진 숫자만큼만 조회
```sql
SELECT column1, column2,.. 
FROM tablename
WHERE condition
LIMIT number;

# celeb 테이블에서 남자 연예인 중 나이가 가장 많은 2명을 조회
SELECT * FROM celeb WHERE sex=&#39;M&#39; ORDER BY age DESC LIMIT 2;</code></pre><hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL TCL]]></title>
            <link>https://velog.io/@one_step/SQL-TCL</link>
            <guid>https://velog.io/@one_step/SQL-TCL</guid>
            <pubDate>Fri, 12 Jan 2024 05:12:08 GMT</pubDate>
            <description><![CDATA[<h2 id="1-트랜잭션">1. 트랜잭션</h2>
<ul>
<li>트랜젝션(Transaction)은 분할할 수 없는 최소단위이며 논리적인 작업 단위이다.</li>
<li>트랜젝션 제어어(TCL)는 데이터조작어(DML) 명령어 실행, 취소, 임시저장할 때 사용하는 명령어이다.</li>
<li>여러 단계의 처리를 <strong>하나의 처리처럼 다루는 기능</strong>이다.</li>
<li>여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료된다.</li>
<li><strong>하나의 명령어라도 잘못되면 전체 취소</strong>된다.</li>
<li>트랜잭션을 쓰는 이유는 <strong>데이터의 일관성을 유지하면서 안정적으로 데이터를 복구</strong>하기 위함이다.
  1) 활성(Active) : 트랜잭션이 정상적으로 실행중인 상태
  2-1) 부분 완료(Partially Committed) : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
  2-2) 완료(Committed) : 트랜잭션이 성공이 종료되어 Commit 연산을 실행한 후의 상태
  2-3) 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  2-2) 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태</li>
</ul>
<p><img src="https://velog.velcdn.com/images/one_step/post/47382939-3a81-49f7-ac98-df059ff08e4c/image.png" alt=""></p>
<h2 id="2-commit-rollback-savepoint">2. COMMIT, ROLLBACK, SAVEPOINT</h2>
<h3 id="commit실행">COMMIT(실행)</h3>
<p><img src="https://velog.velcdn.com/images/one_step/post/7a4359b9-04c5-4ff9-9a93-c5edc5f06869/image.png" alt=""></p>
<pre><code class="language-sql">START TRANSACTION; -- 트랜잭션 시작

SELECT * FROM members; -- 초기 상태 보여줌
INSERT INTO members VALUES(1, &#39;이순신&#39;, &#39;2020-02-02&#39;); -- 데이터 수정
SELECT * FROM members; -- 수정 상태 보여줌

COMMIT -- 트랜잭션을 DB에 적용

SELECT * FROM members; -- 적용된 결과 조회</code></pre>
<h3 id="rollback취소">ROLLBACK(취소)</h3>
<p><img src="https://velog.velcdn.com/images/one_step/post/cc306c66-9f3e-424d-839b-c6b11ad196b3/image.png" alt=""></p>
<pre><code class="language-sql">START TRANSACTION; -- 트랜잭션 시작

SELECT * FROM members; -- 초기 상태 보여줌
INSERT INTO members VALUES(1, &#39;이순신&#39;, &#39;2020-02-02&#39;); -- 데이터 수정
SELECT * FROM members; -- 수정 상태 보여줌

ROLLBACK -- 트랜잭션을 취소하고 START TRANSACTION 실행 전 상태로 롤백함

SELECT * FROM members; -- 조회</code></pre>
<h3 id="savepoint임시저장">SAVEPOINT(임시저장)</h3>
<p><img src="https://velog.velcdn.com/images/one_step/post/20ed85bb-cf50-4c16-9c09-51e87dd36727/image.png" alt=""></p>
<pre><code class="language-sql">DELETE FROM TRAT3 WHERE ID=2012;
COMMIT;
SAVEPOINT S1;
DELETE FROM TRAT3 WHERE ID=2014;
SAVEPOINT S2;
DELETE FROM TRAT3 WHERE ID=2015;
SAVEPOINT S3;
DELETE FROM TRAT3 WHERE ID=2011;
ROLLBACK TO S2;</code></pre>
<ul>
<li>맨 마지막에 ROLLBACK TO S2를 선언했으니, S2로 돌아간다<pre><code class="language-sql">DELETE FROM TRAT3 WHERE ID=2012;
COMMIT;
SAVEPOINT S1;
DELETE FROM TRAT3 WHERE ID=2014;
SAVEPOINT S2;
DELETE FROM TRAT3 WHERE ID=2015;
SAVEPOINT S3;
DELETE FROM TRAT3 WHERE ID=2011;
ROLLBACK TO S2;
SELECT * FROM TRAT3;
COMMIT;
ROLLBACK TO S1;</code></pre>
</li>
<li>SAVEPOINT를 여러개 만들고 난뒤 COMMIT을 하면 앞에 있던 SAVEPOINT는 전부 지워지고 COMMIT까지만 완료된다. 그래서 ROLLBACK TO S1은 오류가 뜨기 때문에 주의해야 한다.</li>
</ul>
<h3 id="mysql-트랜잭션-전역-설정">MYSQL 트랜잭션 전역 설정</h3>
<ul>
<li>MySQL에서는 디폴트로 auto commit이 on으로 설정되어 있다.</li>
<li>세미콜론을 한 번 찍을 때마다 DB에서 자동으로 commit 해주는 시스템이다.
```sql</li>
<li><ul>
<li>오토커밋 off
SET AUTOCOMMIT = 0;</li>
</ul>
</li>
</ul>
<p>-- 오토커밋 on
SET AUTOCOMMIT = 1;</p>
<p>-- 오토쿼리 설정 확인
SELECT @@autocommit;</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) <a href="https://jerryjerryjerry.tistory.com/48">https://jerryjerryjerry.tistory.com/48</a>
2) <a href="https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EC%9D%B4%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC">https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EC%9D%B4%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL Subquery]]></title>
            <link>https://velog.io/@one_step/SQL-Subquery</link>
            <guid>https://velog.io/@one_step/SQL-Subquery</guid>
            <pubDate>Fri, 12 Jan 2024 05:06:35 GMT</pubDate>
            <description><![CDATA[<h2 id="1-about-subquery">1. About Subquery</h2>
<ul>
<li>하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말한다.</li>
<li>메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.<ul>
<li>서브쿼리는 메인쿼리의 칼럼 사용 가능</li>
<li>메인쿼리는 서브쿼리의 칼럼 사용 불가<h3 id="subquery-사용시-주의">Subquery 사용시 주의</h3>
</li>
</ul>
</li>
<li>Subquery 는 괄호로 묶어서 사용</li>
<li>단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능</li>
<li>subquery 에서는 order by 를 사용X</li>
<li>JOIN과 효율성을 따지면서 적절히 사용<br>

</li>
</ul>
<h2 id="2-subquery-종류">2. Subquery 종류</h2>
<ul>
<li>스카라 서브쿼리 (Scalar Subquery) - SELECT 절에 사용</li>
<li>인라인 뷰 (Inline View) - FROM 절에 사용</li>
<li>중첩 서브쿼리 (Nested Subquery) - WHERE 절에 사용<h3 id="스칼라-서브쿼리-scalar-subquery">스칼라 서브쿼리 (Scalar Subquery)</h3>
</li>
<li>SELECT 절에서 사용하는 서브쿼리</li>
<li>결과는 하나의 Column 이어야 한다.<pre><code class="language-sql">SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;</code></pre>
<img src="https://velog.velcdn.com/images/one_step/post/e78bf773-d927-41bd-abbd-8b7c8d5c15dd/image.png" alt=""></li>
</ul>
<h3 id="인라인-뷰-inline-view">인라인 뷰 (Inline View)</h3>
<ul>
<li>FROM 절에 사용하는 서브쿼리</li>
<li>메인쿼리에서는 인라인 뷰에서 조회한 Column만 사용가능하다.</li>
<li>예시) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회<pre><code class="language-sql">SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2 WHERE condition) b
WHERE condition;</code></pre>
<img src="https://velog.velcdn.com/images/one_step/post/338e083f-7dba-455c-ab63-925a931abbfa/image.png" alt=""><h3 id="중첩-서브쿼리-nested-subquery-single-row-multiple-row-multiple-column">중첩 서브쿼리 (Nested Subquery: Single Row, Multiple Row, Multiple Column)</h3>
</li>
<li>WHERE 절에서 사용하는 서브쿼리</li>
<li>Single Row: 하나의 열을 검색하는 서브쿼리</li>
<li>Multiple Row: 하나 이상의 열을 검색하는 서브쿼리</li>
<li>Multiple Column: 하나 이상의 행을 검색하는 서브쿼리<h4 id="1-single-row-subquery">1) Single Row Subquery</h4>
</li>
<li>서브쿼리가 비교연산자( =, &gt;, &gt;=, &lt;, &lt;=, &lt;&gt;, !=)와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다. (두개 이상인 경우 에러)<pre><code class="language-sql">SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;</code></pre>
<h4 id="2-multiple-row-subquery">2) Multiple Row Subquery</h4>
</li>
<li>IN: 서브쿼리 결과 중에 포함 될때(리스트 형태)</li>
<li>EXISTS: 서브쿼리 결과에 값이 있으면 반환</li>
<li>ANY: 서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)</li>
<li>ALL: 서브쿼리 결과를 모두 만족하면 (비교 연산자 사용)<pre><code class="language-sql"># IN
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;
</code></pre>
</li>
</ul>
<h1 id="exists">EXISTS</h1>
<p>SELECT column_names
FROM table_name
WHERE column_name EXISTS (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;</p>
<h1 id="any">ANY</h1>
<p>SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;</p>
<h1 id="all">ALL</h1>
<p>SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;</p>
<pre><code>#### 3) Multiple Column Subquery
- 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우
```sql
SELECT column_names
FROM table_name a
WHERE (a.column1, a.column2,..) IN (SELECT b.column1, b.column2,.. FROM table_name b WHERE a.column_name = b.column_name)
ORDER BY column_name;

# 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사를 조회
SELECT name, sex, agency
FROM celeb
WHERE (sex, agency) IN (SELECT sex, agency FROM celeb WHERE name = &#39;강동원&#39;);</code></pre><hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 결합]]></title>
            <link>https://velog.io/@one_step/SQL-%EA%B2%B0%ED%95%A9</link>
            <guid>https://velog.io/@one_step/SQL-%EA%B2%B0%ED%95%A9</guid>
            <pubDate>Fri, 12 Jan 2024 04:58:54 GMT</pubDate>
            <description><![CDATA[<h2 id="1-union">1. UNION</h2>
<h3 id="union">UNION</h3>
<ul>
<li>여러 개의 SQL문을 합쳐서 하나의 SQL 문으로 만들어주는 방법 <strong>(주의. 칼럼의 개수가 같아야함)</strong></li>
<li>UNION : 중복된 값을 제거하여 알려준다.</li>
<li>UNION ALL : 중복된 값도 모두 보여준다.<pre><code class="language-sql">SELECT column1, column2.. FROM tableA
UNION | UNION ALL
SELECT column1, column2.. FROM tableB;
</code></pre>
</li>
</ul>
<h1 id="성별이-여자인-데이터를-검색하는-쿼리와-소속사가-yg엔터테이먼트인-데이터를-검색하는-쿼리를-union-으로-실행">성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 UNION 으로 실행</h1>
<p>SELECT name, sex, agency FROM celeb WHERE sex=&#39;F&#39;
UNION
SELECT name, sex, agency FROM celeb WHERE agency=&#39;YG엔터테이먼트&#39;;</p>
<pre><code>
## 2. JOIN
### JOIN 기본
![](https://velog.velcdn.com/images/one_step/post/c75a1ae8-1553-4993-aa08-2525665d3b2d/image.png)
### INNER JOIN
- 두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식
```sql
SELECT column1, column2..
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

# snl_show 에 호스트로 출연한 celeb 을 기준으로 celeb 테이블과 snl_show 테이블을 INNER JOIN
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host</code></pre><h3 id="left-join">LEFT JOIN</h3>
<ul>
<li>두개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식<pre><code class="language-sql">SELECT column1, column2..
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;</code></pre>
</li>
</ul>
<h3 id="right-join">RIGHT JOIN</h3>
<ul>
<li>두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식<pre><code class="language-sql">SELECT column1, column2..
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;</code></pre>
</li>
</ul>
<h3 id="full-outer-join">FULL OUTER JOIN</h3>
<ul>
<li>두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식</li>
<li>MySQL 에서는 FULL JOIN 을 지원하지 않으므로 다음의 쿼리로 같은 결과를 만들 수 있다.<pre><code class="language-sql">SELECT column1, column2..
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
UNION
SELECT column1, column2..
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
</code></pre>
</li>
</ul>
<p>&#39;&#39;&#39;
SELECT column1, column2..
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
&#39;&#39;&#39;</p>
<pre><code>
### SELF JOIN
- self join은 inner join과 비슷하고 많이 사용하는 join
- 테이블과 테이블 간에 동일한 칼럼명인 경우 칼럼명만 명시하면 **에러주의**
```sql
SELECT column1, column2..
FROM tableA, tableB,..
WHERE condition;</code></pre><p>1) celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고, 영화배우는 아니면서 YG 엔터테이먼트 소속이거나 40세 이상이면서 YG 엔터테이먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사 정보, 시즌, 에피소드를 검색</p>
<ul>
<li>조건1: snl_show 에 host 로 출연했고</li>
<li>조건2: 영화배우는 아니면서 YG 엔터테이먼트 소속</li>
<li>조건3: 40세 이상이면서 YG 엔터테이먼트 소속이 아닌<pre><code class="language-sql">SELECT celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
FROM celeb, snl_show
WHERE celeb.name = snl_show.host 
AND ((NOT job_title LIKE &#39;%영화배우%&#39; AND agency=&#39;YG엔터테이먼트&#39;) OR (age&gt;=40 AND agency != &#39;YG엔터테이먼트&#39;));</code></pre>
2) snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 2020년 9월 15일 이후에 출연했던 사람을 검색</li>
<li>조건1: snl_show 에 출연</li>
<li>조건2: 에피소드 7, 9, 10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람</li>
<li>조건3: 작년 9월 15일 이후에 출연했던 사람<pre><code class="language-sql">SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host
  AND (episode IN (7, 9, 10) OR agency LIKE &#39;YG______&#39;)
  AND broadcast_date &gt; &#39;2020-09-15&#39;;</code></pre>
</li>
</ul>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL DML(INSERT, UPDATE, DELETE)]]></title>
            <link>https://velog.io/@one_step/SQL-DML</link>
            <guid>https://velog.io/@one_step/SQL-DML</guid>
            <pubDate>Fri, 12 Jan 2024 04:52:34 GMT</pubDate>
            <description><![CDATA[<h2 id="1-insert---데이터-삽입">1. INSERT - 데이터 삽입</h2>
<ul>
<li>입력한 컬럼 이름의 순서와 값의 순서가 일치하도록 주의</li>
<li>모든 컬럼값을 추가하는 경우에는 다음과 같이 컬럼 이름을 지정하지 않아도 되지만, 입력하는 값의 순서가 테이블의 컬럼 순서와 일치하도록 주의<pre><code class="language-sql">INSERT INTO tablename (column1, column2, ...)
VALUES (value1, value2...)
</code></pre>
</li>
</ul>
<p>INSERT INTO tablename VALUES (value1, value2...)</p>
<pre><code>
## 2. UPDATE - 데이터 수정
```sql
UPDATE tablename SET column1 = value1, column2 = value2 WHERE condition;</code></pre><h2 id="3-delete---데이터-삭제">3. DELETE - 데이터 삭제</h2>
<pre><code class="language-sql">DELETE FROM tablename WHERE condition;</code></pre>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL DDL, DCL]]></title>
            <link>https://velog.io/@one_step/SQL-DDL-DCL-TCL</link>
            <guid>https://velog.io/@one_step/SQL-DDL-DCL-TCL</guid>
            <pubDate>Fri, 12 Jan 2024 04:49:18 GMT</pubDate>
            <description><![CDATA[<h2 id="1-database-관리">1. Database 관리</h2>
<ul>
<li>데이터베이스 목록 확인, 생성, 사용, 삭제<pre><code class="language-sql"># 현재 database 목록 확인 
SHOW DATABASES;
</code></pre>
</li>
</ul>
<h1 id="database-이름을-지정하여-생성">Database 이름을 지정하여 생성</h1>
<p>CREATE DATABASE dbname;
CREATE DATABASE dbname DEFAULT CHARACTER SET utf8mb4;</p>
<h1 id="해당-데이터베이스로-이동-사용">해당 데이터베이스로 이동 (사용)</h1>
<p>USE dbname;</p>
<h1 id="database-삭제">Database 삭제</h1>
<p>DROP DATABASE dbname;</p>
<pre><code>## 2. User 관리
### 조회, 생성, 삭제
- 사용자 정보는 mysql 에서 관리하므로 일단 mysql 데이터베이스로 이동후 조회
```sql
USE mysql;
# 조회
SELECT host, USER FROM USER;

# 현재 PC 에서만 접속 가능한 사용자를 비밀번호와 함께 생성
CREATE USER &#39;username&#39;@&#39;localhost&#39; identified BY &#39;password&#39;;

# 외부에서 접속 가능한 사용자를 비밀번호와 함께 생성
CREATE USER &#39;username&#39;@&#39;%&#39; identified BY &#39;password&#39;;

# 접근 범위에 따라 같은 이름의 사용자여도 별도로 삭제
DROP USER &#39;username&#39;@&#39;localhost&#39;
DROP USER &#39;username&#39;@&#39;%&#39; </code></pre><h3 id="권한-관리">권한 관리</h3>
<ul>
<li>권한 목록 확인, 부여, 삭제<pre><code class="language-sql">CREATE DATABASE testdb;
CREATE USER &#39;test&#39;@&#39;LOCALHOST&#39; identified BY &#39;1234&#39;;
</code></pre>
</li>
</ul>
<h1 id="사용자-비밀번호-변경">사용자 비밀번호 변경</h1>
<p>SET PASSWORD FOR &#39;TEST&#39;@LOCALHOST = &#39;TEST&#39;;</p>
<h1 id="사용자에게-부여된-모든-권한-목록을-확인">사용자에게 부여된 모든 권한 목록을 확인</h1>
<p>SHOW GRANTS FOR &#39;test&#39;@&#39;LOCALHOST&#39;;</p>
<h1 id="사용자에게-특정-데이터베이스의-모든-권한을-부여">사용자에게 특정 데이터베이스의 모든 권한을 부여</h1>
<p>GRANT ALL ON testdb.* TO &#39;test&#39;@&#39;LOCALHOST&#39;;</p>
<h1 id="사용자에게-특정-데이터베이스의-모든-권한을-삭제">사용자에게 특정 데이터베이스의 모든 권한을 삭제</h1>
<p>REVOKE ALL ON testdb.* FROM &#39;test&#39;@&#39;LOCALHOST&#39;;</p>
<h1 id="권한-create-alter-drop-insert-delete-update-select-등">권한: CREATE, ALTER, DROP, INSERT, DELETE, UPDATE, SELECT 등</h1>
<h1 id="특정-권한-부여">특정 권한 부여</h1>
<p>GRANT SELECT, DELETE ON PRACTICE.회원테이블 TO &#39;TEST&#39;@LOCALHOST;</p>
<h1 id="특정-권한-제거">특정 권한 제거</h1>
<p>REVOKE DELETE ON PRACTICE.회원테이블 FROM &#39;TEST&#39;@LOCALHOST;</p>
<h1 id="수정내용이-적용이-되지-않은-경우-새로고침">수정내용이 적용이 되지 않은 경우 새로고침</h1>
<p>FLUSH PRIVILEGES;</p>
<pre><code>
## 3. Table
### Table 생성, 확인
- 임시 테이블도 생성이 가능하다 대신 서버 연결 종료시 자동으로 삭제된다.
```sql
CREATE DATABASE zerobase DEFAULT CHARACTER SET utf8mb4;

# Table 생성 문법
CREATE TABLE tablename(
    columnname datatype,
    columnname datatype,
    id int,
    name varchar(16),
);

# 임시 테이블 생성
CREATE TEMPORARY TABLE tablename(
    columnname datatype,
    columnname datatype,
    id int,
    name varchar(16),
); 

CREATE TABLE tablename1
SELECT A.*, B.column
FROM tablename2 AS A
INNER JOIN tablename3 AS B
ON A.column = B.column;


# Table 목록 확인
SHOW TABLES;

# Table 정보 확인 
DESC tablename;</code></pre><h3 id="table-변경-컬럼-추가-컬럼-변경-삭제">Table 변경, 컬럼 추가, 컬럼 변경, 삭제</h3>
<pre><code class="language-sql"># Table 이름 변경
ALTER TABLE tablename RENAME newname;

# Table Column 추가
ALTER TABLE tablename ADD COLUMN columnname datatype;

# Table Column 변경 - datatype
ALTER TABLE tablename MODIFY COLUMN columnname datatype;

# Table Column 변경 - name
ALTER TABLE tablename CHANGE COLUMN columnname new_columnname new_datatype;
ALTER TABLE tablename RENAME COLUMN columnnamen to new_columnname;

# Table Column 삭제 
ALTER TABLE tablename DROP COLUMN columnname;

# Table 삭제
DROP TABLE tablename;</code></pre>
<h3 id="primary-key기본-키">PRIMARY KEY(기본 키)</h3>
<ul>
<li>테이블의 각 레코드를 식별</li>
<li>중복되지 않은 고유값을 포함</li>
<li>NULL 값을 포함할 수 없음</li>
<li>테이블 당 하나의 기본키를 가짐<pre><code class="language-sql"># 하나의 칼럼을 기본키로 설정하는 경우
CREATE TABLE person(
  pid int NOT NULL,
  name varchar(16),
  age int,
  sex char,
  PRIMARY KEY (pid)
);
</code></pre>
</li>
</ul>
<h1 id="여러개의-칼럼을-기본키로-설정하는-경우">여러개의 칼럼을 기본키로 설정하는 경우</h1>
<p>CREATE TABLE animal(
    name varchar(16) NOT NULL,
    type varchar(16) NOT NULL,
    age int,
    PRIMARY KEY (name, type)
);</p>
<pre><code>- PRIMARY KEY 삭제(삭제하는 방법은 동일)
```sql
ALTER TABLE tablename DROP PRIMARY KEY;</code></pre><ul>
<li>기존 테이블에서 PRIMARY KEY 생성<pre><code class="language-sql">ALTER TABLE tablename ADD PRIMARY KEY (column1, column2..);
</code></pre>
</li>
</ul>
<h1 id="constraint-생략해도-자동으로-생성">CONSTRAINT 생략해도 자동으로 생성</h1>
<p>ALTER TABLE tablename ADD CONSTRAINT PK_table PRIMARY KEY (column1, column2..);</p>
<pre><code>### FOREIGN KEY (외래키)
- 한 테이블을 다른 테이블과 연결해주는 역할이며, 참조되는 테이블의 항목은 그 테이블의 기본키 (혹은 단일값)
1) CREATE TABLE 에서 FOREIGN KEY를 지정하는 경우
```sql
CREATE TABLE orders(
    oid int NOT NULL,
    order_no varchar(16),
    pid int,
    PRIMARY KEY (oid),
    CONSTRAINT FK_person FOREIGN KEY(pid) REFERENCES person(pid)
);

# CONSTRAINT 생략
CREATE TABLE job(
    jib int NOT NULL,
    name varchar(16),
    pid int,
    PRIMARY KEY (jid),
    FOREIGN KEY(pid) REFERENCES person(pid)
);

# 자동 생성된 CONSTRAINT 확인하는 방법
SHOW CREATE TABLE tablename;</code></pre><p>2) 기존 table에서 FOREIGN KEY를 지정(ALTER TABLE 이용)</p>
<pre><code class="language-sql">ALTER TABLE tablename
ADD FOREIGN KEY (column) REFERENCES REF_table(REF_column);</code></pre>
<p>3) FOREIGN KEY 삭제</p>
<pre><code class="language-sql">ALTER TABLE tablename DROP FOREIGN KEY FK_constraint;</code></pre>
<p>4) 예시 (경찰서 이름이 형식이 다르게 표시되는 각 테이블 이용)</p>
<pre><code class="language-sql"># police_station.name 기본키로 설정
ALTER TABLE police_station ADD PRIMARY KEY (name);

# crime_status 테이블에 Foreign Key 로 사용할 Column 추가
ALTER TABLE crime_status ADD COLUMN reference VARCHAR(16);

# Foreign Key 생성
ALTER TABLE crime_status ADD FOREIGN KEY (reference) REFERENCES police_station(name);

# Foreign Key 값 Update
UPDATE crime_status c, police_station p
SET c.reference = p.name
WHERE p.name LIKE concat(&#39;서울&#39;, c.police_station, &#39;경찰서&#39;);

# JOIN (Foreign Key 를 기준으로 두 테이블을 연관시켜 검색)
SELECT c.police_station, p.address
FROM crime_status c, police_station p
WHERE c.reference = p.name
GROUP BY c.police_station;</code></pre>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL에 로컬 파일 넣기]]></title>
            <link>https://velog.io/@one_step/SQL%EC%97%90-%EB%A1%9C%EC%BB%AC-%ED%8C%8C%EC%9D%BC-%EB%84%A3%EA%B8%B0</link>
            <guid>https://velog.io/@one_step/SQL%EC%97%90-%EB%A1%9C%EC%BB%AC-%ED%8C%8C%EC%9D%BC-%EB%84%A3%EA%B8%B0</guid>
            <pubDate>Fri, 12 Jan 2024 00:35:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li>서버가 local-infile을 허용하고 있는지 확인하고 활성화 방법</li>
</ul>
<pre><code class="language-sql">SHOW VARIABLES LIKE &#39;local_inflie&#39;;

# 활성화 1 또는 True
SET GLOBAL local_infile = 1;</code></pre>
<ul>
<li>로컬 파일 넣기</li>
</ul>
<pre><code class="language-sql">#mysql --local-infile=1 -u root -p

USE dbname;
LOAD DATA LOCAL INFILE &#39;파일위치&#39;
INTO TABLE tablename
FIELDS TERMINATED BY &#39;,&#39; # 구분자 기호입력
ENCLOSED by &#39;&quot;&#39; # 각 컬럼/필드는 &quot;&quot;로 감싸져 있음
LINES TERMINATED BY &#39;\n&#39; # 각 라인 구분은 \n
IGNORE 1 ROWS; # 각행의 머리글 무시</code></pre>
<hr>
<blockquote>
<p>Reference
<a href="https://velog.io/@dyjeong/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-mysql-csv-import%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">https://velog.io/@dyjeong/터미널에서-mysql-csv-import하는-방법</a>
<a href="https://velog.io/@dyjeong/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-mysql-csv-import%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">https://velog.io/@dyjeong/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-mysql-csv-import%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</a>
<a href="https://semode.tistory.com/496">https://semode.tistory.com/496</a>
<a href="https://passwd.tistory.com/entry/MySQL-ERROR-2068-HY000-at-line-2-LOAD-DATA-LOCAL-INFILE-file-request-rejected-due-to-restrictions-on-access">https://passwd.tistory.com/entry/MySQL-ERROR-2068-HY000-at-line-2-LOAD-DATA-LOCAL-INFILE-file-request-rejected-due-to-restrictions-on-access</a>
<a href="https://piaojian.tistory.com/61">https://piaojian.tistory.com/61</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 집계 함수, 스칼라 함수]]></title>
            <link>https://velog.io/@one_step/SQL-10-173</link>
            <guid>https://velog.io/@one_step/SQL-10-173</guid>
            <pubDate>Thu, 11 Jan 2024 08:13:34 GMT</pubDate>
            <description><![CDATA[<h2 id="1-aggregate-functions-집계함수">1. Aggregate Functions (집계함수)</h2>
<ul>
<li>여러 칼럼 혹은 테이블 전체 칼럼으로부터 하나의 결과값을 반환하는 함수
<img src="https://velog.velcdn.com/images/one_step/post/b37b213e-8201-4527-9470-cf83bc5ccdcc/image.png" alt=""><h3 id="count">COUNT</h3>
</li>
<li>총 갯수를 계산해 주는 함수<pre><code class="language-sql">SELECT COUNT(column) FROM tablename WHERE condition;
</code></pre>
</li>
</ul>
<p>#중복 회피
SELECT COUNT(DISTINCT column) FROM tablename WHERE condition; </p>
<pre><code>### SUM
- 숫자 칼럼의 합계를 계산해주는 함수
```sql
SELECT SUM(column) FROM tablename WHERE condition;</code></pre><h3 id="avg">AVG</h3>
<ul>
<li>숫자 칼럼의 평균을 계산해주는 함수<pre><code class="language-sql">SELECT SUM(column) FROM tablename WHERE condition;</code></pre>
<h3 id="min">MIN</h3>
</li>
<li>숫자 칼럼 중 가장 작은 값을 찾아주는 함수<pre><code class="language-sql">SELECT MIN(column) FROM tablename WHERE condition;</code></pre>
<h3 id="max">MAX</h3>
</li>
<li>숫자 칼럼 중 가장 큰 값을 찾아주는 함수<pre><code class="language-sql">SELECT MAX(column) FROM tablename WHERE condition;</code></pre>
<br>

</li>
</ul>
<h2 id="2-scalar-functions">2. Scalar Functions</h2>
<ul>
<li>입력값을 기준으로 단일 값을 반환하는 함수
<img src="https://velog.velcdn.com/images/one_step/post/96ba2672-c5a8-4008-a5d7-d019c87fc99a/image.png" alt=""><h3 id="ucase">UCASE</h3>
</li>
<li>영문을 대문자로 반환하는 함수<pre><code class="language-sql">SELECT UCASE(string);
</code></pre>
</li>
</ul>
<h1 id="15-가-넘는-메뉴를-대문자로-조회">$15 가 넘는 메뉴를 대문자로 조회</h1>
<p>SELECT UCASE(menu) FROM sandwich WHERE price &gt; 15;</p>
<pre><code>### LCASE
- 영문을 소문자로 변환하는 함수
```sql
SELECT LCASE(string);</code></pre><h3 id="mid">MID</h3>
<ul>
<li>문자열 부분을 반환하는 함수</li>
<li>string: 원본 문자열</li>
<li>start_position: 문자열 반환 시작 위치(첫글자는 1, 마지막글자는 -1)</li>
<li>length: 반환할 문자열 길이<pre><code class="language-sql">SELECT MID(string, start_position, lenth);</code></pre>
<h3 id="length">LENGTH</h3>
</li>
<li>문자열의 길이를 반환하는 함수</li>
<li>문자가 없는 경우 길이도 0</li>
<li>공백의 경우에도 문자이므로 길이가 1</li>
<li>NULL 의 경우 길이가 없으므로 NULL<pre><code class="language-sql">SELECT LENGTH(string);</code></pre>
<h3 id="round">ROUND</h3>
</li>
<li>지정한 자리에서 숫자를 반올림하는 함수</li>
<li>number: 반올림할 대상</li>
<li>decimals: 반올림할 소수점 위치 (Option)</li>
<li>반올림할 위치를 지정하지 않을 경우, 소수점 자리 (0) 에서 반올림</li>
<li>일단위: -1, 십단위: -2<pre><code class="language-sql">SELECT ROUND(number, decimals);
</code></pre>
</li>
</ul>
<p>SELECT ROUND(315.625, 0); # 316</p>
<pre><code>### NOW
- 현재 날짜 및 시간을 반환하는 함수
```sql
SELECT NOW();</code></pre><h3 id="format">FORMAT</h3>
<ul>
<li>숫자를 천단위 콤마가 있는 형식으로 반환하는 함수</li>
<li>number: 포맷을 적용할 문자 혹은 숫자</li>
<li>decimals: 표시할 소수점 위치<pre><code class="language-sql">SELECT FORMAT(number, decimals);
</code></pre>
</li>
</ul>
<p>SELECT FORMAT(12345.6789, 0); # 12,346</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL AWS, python]]></title>
            <link>https://velog.io/@one_step/SQL-10172</link>
            <guid>https://velog.io/@one_step/SQL-10172</guid>
            <pubDate>Thu, 11 Jan 2024 08:11:48 GMT</pubDate>
            <description><![CDATA[<h2 id="1-aws-rds">1. AWS RDS</h2>
<h3 id="aws-rds-터미널-실행">AWS RDS 터미널 실행</h3>
<pre><code>% mysql -h &quot;엔드포인트&quot; -P 포트 -u 마스터 사용자 이름 -p</code></pre><h3 id="aws-rds-중지--시작">AWS RDS 중지 / 시작</h3>
<ul>
<li>중지: AWS -&gt; RDS -&gt; 데이터베이스 작업 선택에서 일시 중지 클릭</li>
<li>시작: AWS -&gt; RDS -&gt; 데이터베이스 -&gt; 해당 데이터베이스 클릭 작업 시작 클릭</li>
</ul>
<h2 id="2-sql-file">2. SQL FILE</h2>
<h3 id="sql-file">SQL File</h3>
<ul>
<li>SQL 쿼리를 모아놓은 파일<h3 id="sql-file-실행">SQL File 실행</h3>
<h4 id="1-로그인-이후">1) 로그인 이후</h4>
<pre><code class="language-sql">source /path/filename.sql
\. /path/filename.sql # source 대신 \. 사용가능
\. filename.sql # 현재 폴더에 있으면 path 생략 가능
</code></pre>
</li>
</ul>
<p>source test01.sql</p>
<pre><code>#### 2) 외부에서 바로 실행
```sql
% mysql -u username -p databasename &lt; /path/filename.sql
% mysql -u root -p zerobase &lt; test02.sql</code></pre><h3 id="database-backup">Database Backup</h3>
<ul>
<li>SQL File 로 Database 를 백업할 수 있다.<pre><code>% mysqldump -u username -p dbname &gt; backup.sql # 특정 database backup
% mysqldump -u username -p --all-databases &gt; backup.sql # 모든 Database backup
% mysqldump --set-gtid-purged=OFF -h 엔드포인트 -P 포트 -u username -p databasename filename.sql # AWS Database backup</code></pre><h3 id="database-restore">Database Restore</h3>
</li>
<li>데이터베이스를 백업한 SQL File 을 실행하여 그 시점으로 복구하거나 이전 할 수 있다. (SQL File 을 실행하는 방법과 동일함)<pre><code># AWS RDS 서비스가 사용 가능한 상태에서 접속
% mysql -h 엔드포인트 -P 포트 -u 마스터 사용자 이름 -p
</code></pre></li>
</ul>
<p>mysql&gt; use dbname;
mysql&gt; source filename.sql</p>
<pre><code>### Table Backup
- Table 단위로도 백업할 수 있다.</code></pre><p>% mysqldump -u username -p dbname tablename &gt; backup.sql</p>
<pre><code>### Table Restore
- Table 을 백업한 SQL File 을 실행하여, 해당 테이블을 복구하거나 이전할 수 있다. (SQL File 을 실행하는 방법과 동일함)
### Table Schema Backup
- 데이터를 제외하고 테이블 생성 쿼리만 백업할 수 있다.</code></pre><p>% mysqldump -d -u username -p dbname tablename &gt; backup.sql # 특정 table schema backup
% mysqldump -d -u username -p dbname &gt; backup.sql # 모든 table schema backup</p>
<pre><code>&lt;br&gt;

## 3. Python with MySQL
### Python 으로 MySQL 접속 후 사용하는 방법
- Create Connection
- Close Database -&gt; 낭비가 없도록 꼭 닫기!
- Connect to Database
```python
!pip install mysql-connector-python

import mysql.connector
#local
mydb = mysql.connector.connect(
    host =&quot;hostname&quot;,
    user=&quot;username&quot;,
    password=&quot;password&quot;
)

# AWS RDS
mydb = mysql.connector.connect(
    host =&quot;hostname&quot;,
    port = port,
    user=&quot;username&quot;,
    password=&quot;password&quot;
)

# close database
mydb.close()

#특정 database 접속 코드
mydb = mysql.connector.connect(
    host =&quot;hostname&quot;,
    user=&quot;username&quot;,
    password=&quot;password&quot;,
    database=&quot;databasename&quot;
)</code></pre><h3 id="execute-sql">Execute SQL</h3>
<ul>
<li>Query 를 실행하기 위한 코드<pre><code class="language-python">import mysql.connector
mydb = mysql.connector.conncet(
  host =&quot;hostname&quot;,
  user=&quot;username&quot;,
  password=&quot;password&quot;,
  database=&quot;databasename&quot;
)
mycursor = mydb.cursor()
mycursor.execute(&lt;query&gt;)</code></pre>
</li>
<li>테이블 생성<pre><code class="language-python">cursor = mydb.cursor()
cursor.execute(&quot;CREATE TABLE sql_file (id int, filename varchar(16))&quot;)
mydb.close()</code></pre>
</li>
<li>테이블 삭제<pre><code class="language-python">cursor = mydb.cursor()
cursor.execute(&quot;DROP TABLE sql_file&quot;)
mydb.close()</code></pre>
</li>
<li>SQL File 을 실행하기 위한 코드<pre><code class="language-sql"># test.sql
CREATE TABLE sql_file(
  id int,
  filename varchar(16)
);</code></pre>
<pre><code class="language-python"># python 
mycursor = mydb.cursor()
sql = open(&quot;&lt;filename&gt;.sql&quot;).read()
mycursor.execute(sql)
</code></pre>
</li>
</ul>
<p>cur = mydb.cursor()
sql = open(&quot;test.sql&quot;).read()
cur.execute(sql)
mydb.close()</p>
<pre><code>- SQL File 내에 Query 가 여러개 존재하는 경우
```sql
# test02.sql
INSERT INTO sql_file VALUES (1, &quot;test01.sql&quot;);
INSERT INTO sql_file VALUES (2, &quot;test02.sql&quot;);
INSERT INTO sql_file VALUES (3, &quot;test03.sql&quot;);
INSERT INTO sql_file VALUES (4, &quot;test04.sql&quot;);</code></pre><pre><code class="language-python"># python
mycursor = mydb.cursor()
sql = open(&quot;test02.sql&quot;).read()
mycursor.execute(sql, multi=True)
mydb.commit()
mydb.close()</code></pre>
<h3 id="fetch-all">Fetch All</h3>
<ul>
<li>sql_file 테이블 조회 (읽어올 데이터 양이 많은 경우 buffered=True)<pre><code class="language-python">mycursor.execute(&lt;query&gt;)
</code></pre>
</li>
</ul>
<p>result = mycursor.fetchall()
for data in result:
    print(data)</p>
<hr>
<p>cur = mydb.cursor(buffered=True)
sql = open(&quot;test02.sql&quot;).read()
result = cur.execute(sql, multi=True)</p>
<p>for result_iterator in result:
    if result_iterator.with_rows:
        print(result_iterator.fetchall())
    else:
        print(result_iterator.statement)
mydb.commit()
mydb.close()</p>
<h1 id="dataframe으로-읽기">dataframe으로 읽기</h1>
<p>import pandas as pd
df = pd.DataFrame(result)
df.head()</p>
<pre><code>&lt;br&gt;

## 4. Python with CSV
1) 제공받은 police_station.csv 를 Pandas 로 읽어와서 데이터를 확인
2) csv 한글이 깨지는 경우, encoding 값을 &#39;euc-kr&#39; 로 설정 (특히 우리나라 사이트에서 제공받은 csv 파일들.)
3) mysql 연결
4) Query 를 실행하기 위한 코드
5) CSV 에 있는 데이터를 Python 으로 INSERT
6) commit() 은 database 에 적용하기 위한 명령
7) 결과 확인
```python
# 1, 2번
import pandas as pd
df = pd.read_csv(&quot;police_station.csv&quot;, encoding=&quot;euc-kr&quot;)
df.head()

# 3번
conn = mysql.connector.connect(
    host=&quot;hostname&quot;,
    port = port,
    user =&quot;username&quot;,
    password = &quot;password&quot;,
    database = &quot;databasename&quot;
)

# 4번
cursor = conn.cursor(buffered=True)
sql = &quot;INSERT INTO police_station VALUES (%s, %s)&quot;

# 5번(for문에 commit()을 넣어주면 에러가 생겨도 그 전까지는 데이터가 넣어짐)
for i, row in df.iterrows():
    cursor.execute(sql, tuple(row))
    print(tuple(row))
    conn.commit()

# 6번
cursor.execute(&quot;SELECT * FROM police_station&quot;)
result = cursor.fetchall()
for row in result:
    print(row)

#추가 데이터프레임으로 확인
df = pd.DataFrame(result)
df.head()

conn.close()</code></pre><hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenCV DNN 얼굴 검출]]></title>
            <link>https://velog.io/@one_step/OpenCV-DNN%EC%96%BC%EA%B5%B4%EA%B2%80%EC%B6%9C</link>
            <guid>https://velog.io/@one_step/OpenCV-DNN%EC%96%BC%EA%B5%B4%EA%B2%80%EC%B6%9C</guid>
            <pubDate>Wed, 28 Jun 2023 07:09:36 GMT</pubDate>
            <description><![CDATA[<ul>
<li><a href="https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector">https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector</a><h3 id="opencv-dnn-얼굴-검출기-입력">OpenCV DNN 얼굴 검출기 입력</h3>
</li>
<li>입력 영상 크기:300x300</li>
<li>픽셀값범위: 0 ~ 255 (0 ~ 1인 함수도 존재)</li>
<li>색상채널순서:BGR (RGB인 함수도 존재)</li>
<li>평균픽셀값: (104,177,123)<h3 id="opencv-dnn-얼굴-검출기-출력">OpenCV DNN 얼굴 검출기 출력</h3>
</li>
<li>shape=(1, 1, 200, 7), dtype=float32</li>
<li>detect = out[0, 0, :, :]<h3 id="opencv-dnn-얼굴-검출-코드-작성-순서">OpenCV DNN 얼굴 검출 코드 작성 순서</h3>
<img src="https://velog.velcdn.com/images/one_step/post/7cb4a8be-12d2-4fd4-93fc-d7d8a68d1c36/image.png" alt=""><h3 id="영상의-크기-변환">영상의 크기 변환</h3>
<pre><code class="language-python">cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) -&gt; dst</code></pre>
</li>
<li>src: 입력 영상</li>
<li>dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 fx와 fy값을 이용하여 결정.</li>
<li>dst:출력 영상</li>
<li>fx, fy: x와 y방향 스케일 비율(scale factor). (dsize값이0일때유효)</li>
<li>interpolation: 보간법 지정. 기본값은 cv2.INTER_LINEAR.<ul>
<li>cv2.INTER_NEAREST: 최근방 이웃 보간법</li>
<li>cv2.INTER_LINEAR: 양선형 보간법(2x2이웃픽셀참조)</li>
<li>cv2.INTER_CUBIC: 3차회선 보간법(4x4 이웃픽셀참조)</li>
<li>cv2.INTER_LANCZOS4: Lanczos 보간법(8x8 이웃픽셀참조)</li>
<li>cv2.INTER_AREA: 영상 축소 시 효과적</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenCV 응용: 명함 검출과 인식]]></title>
            <link>https://velog.io/@one_step/OpenCV-%EC%9D%91%EC%9A%A9-%EB%AA%85%ED%95%A8-%EA%B2%80%EC%B6%9C%EA%B3%BC-%EC%9D%B8%EC%8B%9D</link>
            <guid>https://velog.io/@one_step/OpenCV-%EC%9D%91%EC%9A%A9-%EB%AA%85%ED%95%A8-%EA%B2%80%EC%B6%9C%EA%B3%BC-%EC%9D%B8%EC%8B%9D</guid>
            <pubDate>Wed, 28 Jun 2023 06:57:57 GMT</pubDate>
            <description><![CDATA[<h3 id="일반적인-명함사진의-조건">일반적인 명함사진의 조건</h3>
<ul>
<li>명함은 흰색이고, 배경은 충분히 어둡다.</li>
<li>명함은 각진 사각형 모양이고, 가로, 세로비율 9:5 이다.</li>
<li>명함은 충분히 크게 촬영되었다.</li>
<li>수행과정: 이진화 &gt; 외곽선 검출 &amp; 다각형 근사화 &gt; 투명 변환 &gt; OCR<h2 id="1-그레이-스케일화">1) 그레이 스케일화</h2>
<h3 id="컬러영상을-그레이-스케일-영상으로-변환하여-사용">컬러영상을 그레이 스케일 영상으로 변환하여 사용</h3>
</li>
<li>컬러 정보가 크게 중요하지 않은경우, 그레이 스케일 영상으로 변환하여 처리하는 것이 메모리 사용량, 연산시간 측면에서 유리함</li>
<li>OpenCV의 <code>cv2.imread()</code> 함수에서 그레이 스케일형식으로 영상을 불러오거나 또는 <code>cv2.cvtColor()</code> 함수를 사용하여 그레이 스케일 형식으로 변경가능<h2 id="2-이진화">2) 이진화</h2>
<h3 id="영상의-이진화binarization">영상의 이진화(binarization)</h3>
</li>
<li>영상의 픽셀값을 0 또는1(255)로 만드는 연산<ul>
<li>배경(background) vs. 객체(object)</li>
<li>관심영역 vs. 비관심영역<h3 id="그레이-스케일의-이진화">그레이 스케일의 이진화</h3>
<img src="https://velog.velcdn.com/images/one_step/post/c053c124-afcb-40ef-9ade-33b0cc63ec7d/image.png" alt=""></li>
</ul>
</li>
<li>T: 임계값, 문턱치, threshold<h3 id="자동-임계-값-결정-방법-오츠otsu방법">자동 임계 값 결정 방법: 오츠(Otsu)방법</h3>
<img src="https://velog.velcdn.com/images/one_step/post/ca72f523-a16e-42bf-9836-72d21a26dc17/image.png" alt=""></li>
<li>입력 영상이 배경(background)과 객체(object) 두 개로 구성되어 있다고 가정<ul>
<li>bimodal histogram</li>
</ul>
</li>
<li>두 픽셀 분포의 분산의 합이 최소가 되는 임계 값을 선택</li>
<li>효과적인 수식 전개와 재귀식을 이용하여 빠르게 임계 값을 결정<h3 id="opencv-이진화임계값함수">OpenCV 이진화(임계값)함수</h3>
<pre><code class="language-python">cv2.threshold(src, thresh, maxval, type, dst=None) -&gt; retval,dst</code></pre>
</li>
<li>src: 입력영상(다채널, 8비트또는32비트실수형)</li>
<li>thresh: 임계값</li>
<li>maxval: 결과 이진 영상에서 최대 픽셀값(보통255를지정)</li>
<li>type: 임계값에 의한 변환함수 지정 또는 자동 임계값 설정방법<ul>
<li>cv2.THRESH_BINARY: 이진화</li>
<li>cv2.THRESH_BINARY_INV: 이진화 후 반전</li>
<li>cv2.THRESH_BINARY | cv2.THRESH_OTSU: 자동 이진화</li>
</ul>
</li>
<li>retval:사용된 임계값</li>
<li>dst: (출력) 입계값 영상(src와동일크기, 동일타입)<h2 id="3-객체-단위-분석">3) 객체 단위 분석</h2>
</li>
<li>레이블링 <ul>
<li>영역기반 모양 분석</li>
<li>레이블맵, 바운딩박스,픽셀개수, 무게 중심좌표를 반환</li>
</ul>
</li>
<li>외곽선 검출</li>
<li>외곽선 기반 모양 분석</li>
<li>외곽선 점들의 좌표와 계층구조를 반환</li>
<li>다양한 외곽선 처리함수에서 활용가능(면적계산, 근사화등)<h3 id="객체의외곽선검출">객체의외곽선검출</h3>
</li>
<li>외곽선 검출이란?<ul>
<li>객체의 외곽선 좌표를 모두 추출하는 작업. Boundary tracking. Contour tracing.</li>
<li>바깥쪽&amp; 안쪽(홀) 외곽선 → 외곽선의 계층구조도 표현가능</li>
</ul>
</li>
<li>외곽선 객체 하나의 표현방법<ul>
<li>numpy.ndarray</li>
<li>shape=(K, 1, 2) (K는외곽선좌표개수)</li>
<li>dtype=numpy.int32</li>
</ul>
</li>
<li>여러 객체의 전체 외곽선 표현방법<ul>
<li>&quot;객체 하나의 외곽선(numpy.ndarray)&quot;을 원소로 갖는 리스트</li>
<li>len(리스트)= 전체외곽선개수(N)<h3 id="외곽선-검출">외곽선 검출</h3>
<pre><code class="language-python">cv2.findContours(image, mode, method, contours=None, hierarchy=None,
offset=None) -&gt; contours, hierarchy</code></pre>
</li>
</ul>
</li>
<li>image: 입력영상. non-zero 픽셀을객체로간주함.</li>
<li>mode: 외곽선 검출모드. cv2.RETR_ 로 시작하는상수.<ul>
<li>cv2.RETR_EXTERNAL: 바깥쪽외곽선만검출</li>
<li>cv2.RETR_LIST: 모든외곽선검출</li>
<li>cv2.RETR_CCOMP: 2-레벨계층구조로검출</li>
<li>cv2.RETR_TREE: 전체계층구조로검출</li>
</ul>
</li>
<li>method: 외곽선 근사화 방법. 근사화가 필요하지 않으면 cv2.CHAIN_APPROX_NONE 지정.</li>
<li>contours: 검출된 외곽선 좌표. numpy.ndarray로 구성된 리스트.len(contours)=전체외곽선개수(N).
contours[i].shape=(K, 1, 2).
contours[i].dtype=numpy.int32.</li>
<li>hierarchy: 외곽선 계층 정보. 자세한내용은 OpenCV 도움말참고.</li>
<li>offset: 좌표값 이동옵셋. 기본값은(0, 0).<h3 id="외곽선-그리기">외곽선 그리기</h3>
```python
cv2.drawContours(image, contours, contourIdx, color, thickness=None,
lineType=None, hierarchy=None, maxLevel=None, offset=None)</li>
<li><blockquote>
<p>image
```</p>
</blockquote>
</li>
<li>image:입출력 영상</li>
<li>contours:(cv2.findContours() 함수로구한) 외곽선 좌표정보</li>
<li>contourIdx:외곽선인덱스. 음수(-1)를 지정하면 모든 외곽선을 그림.</li>
<li>color:외곽선 색상</li>
<li>thickness: 외곽선 두께. thinkness&lt; 0이면 내부를 채운다.</li>
<li>lineType: LINE_4, LINE_8, LINE_AA 중 하나 지정</li>
<li>hierarchy: 외곽선 계층 정보.</li>
<li>maxLevel: 그리기를 수행 할 최대 외곽선 레벨<h3 id="주요-외곽선-관련-함수">주요 외곽선 관련 함수</h3>
</li>
<li><code>cv2.arcLength(curve, closed) -&gt; retval</code><ul>
<li>curve:외곽선 좌표. numpy.ndarray. shape=(K, 1, 2).</li>
<li>closed: True이면 폐곡선으로 간주</li>
<li>retval: 외곽선 길이</li>
</ul>
</li>
<li><code>cv2.contourArea(contour, oriented=None) -&gt; retval</code><ul>
<li>contour: 외곽선 좌표. numpy.ndarray. shape=(K, 1, 2).</li>
<li>oriented: True이면 외곽선 진행 방향에 따라 부호 있는 면적을 반환. 기본값은 False.</li>
<li>retval: 외곽선으로 구성된 면적</li>
</ul>
</li>
<li><code>cv2.boundingRect()</code>: 주어진 점을 감싸는 최소 크기 사각형(바운딩박스) 반환</li>
<li><code>cv2.minEnclosingCircle()</code>: 주어진 점을 감싸는 최소 크기 원을 반환</li>
<li><code>cv2.minAreaRect()</code>: 주어진 점을 감싸는 최소 크기 회전된 사각형을 반환</li>
<li><code>cv2.minEnclosingTriangle()</code>: 주어진 점을 감싸는 최소 크기 삼각형을 반환</li>
<li><code>cv2.approxPolyDP(curve, epsilon, closed, approxCurve=None) -&gt; approxCurve</code><ul>
<li>curve: 입력 곡선 좌표. numpy.ndarray. shape=(K, 1, 2).</li>
<li>epsilon: 근사화 정밀도 조절. 입력곡선과 근사화 곡선 간의 최대거리. 
e.g)(외곽선전체길이)* 0.02</li>
<li>closed: True를 전달하면 폐곡선으로 간주</li>
<li>approxCurve: 근사화된 곡선 좌표. numpy.ndarray. shape=(k, 1, 2).<h2 id="영상의-기하학적-변환">영상의 기하학적 변환</h2>
</li>
</ul>
</li>
<li>영상의 기하학적 변환(geometric transformation)이란?<ul>
<li>영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체영상의 모양을 바꾸는 작업</li>
<li>영상의 크기변환, 대칭변환, 회전변환 등<h3 id="투시-변환-행렬-구하기">투시 변환 행렬 구하기</h3>
<pre><code class="language-python">cv2.getPerspectiveTransform(src, dst, solveMethod=None) -&gt; retval</code></pre>
</li>
</ul>
</li>
<li>src: 4개의 원본 좌표점. numpy.ndarray. shape=(4, 2).
e.g) np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.float32)</li>
<li>dst: 4개의 결과 좌표점. numpy.ndarray. shape=(4, 2).</li>
<li>반환값: 3x3 크기의 투시 변환 행렬<h3 id="영상의투시변환">영상의투시변환</h3>
<pre><code class="language-python">cv2.warpPerspective(src, M, dsize, dst=None, flags=None,
borderMode=None, borderValue=None) -&gt; dst</code></pre>
</li>
<li>src: 입력 영상</li>
<li>M: 3x3 변환행렬. numpy.ndarray.</li>
<li>dsize: 결과영상의크기. (0, 0)을 지정하면 src와 같은크기.</li>
<li>dst: 출력영상</li>
<li>flags: 보간법. 기본값은cv2.INTER_LINEAR</li>
<li>borderMode: 가장자리 픽셀 확장방식.</li>
<li>borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수값.기본값은 0.</li>
</ul>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[동영상 저장하기]]></title>
            <link>https://velog.io/@one_step/%EB%8F%99%EC%98%81%EC%83%81-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@one_step/%EB%8F%99%EC%98%81%EC%83%81-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 Jun 2023 06:16:54 GMT</pubDate>
            <description><![CDATA[<h2 id="cv2videowriter-클래스">cv2.VideoWriter 클래스</h2>
<ul>
<li>OpenCV에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있음</li>
<li>일련의 프레임은 모두 크기와 데이터 타입이 같아야함<h3 id="fourcc-4-문자코드-four-character-code">Fourcc (4-문자코드, four character code)</h3>
</li>
<li>동영상 파일의 코덱, 압축방식, 색상, 픽셀 포맷 등을 정의하는 정수값</li>
<li>주요 Fourcc 예제:<ul>
<li>cv2.VideoWriter_fourcc(*&#39;DIVX&#39;): DIVX MPEG-4 코덱</li>
<li>cv2.VideoWriter_fourcc(*&#39;XVID&#39;): XVID MPEG-4 코덱</li>
<li>cv2.VideoWriter_fourcc(*&#39;X264&#39;): H.264/AVC 코덱</li>
<li>cv2.VideoWriter_fourcc(*&#39;MJPG&#39;): Motion-JPEG 코덱</li>
</ul>
</li>
</ul>
<h3 id="저장을-위한-동영상-파일-열기">저장을 위한 동영상 파일 열기</h3>
<pre><code class="language-python">cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None) -&gt; retval</code></pre>
<ul>
<li>filename: 비디오 파일 이름(e.g. &#39;video.mp4&#39;)</li>
<li>fourcc: fourcc(e.g. cv2.VideoWriter_fourcc(*&#39;DIVX&#39;))</li>
<li>fps: 초당프레임수(e.g. 30)</li>
<li>frameSize: 프레임 크기. (width, height) 튜플.</li>
<li>isColor: 컬러영상이면 True, 그렇지않으면 False.</li>
<li>retval: cv2.VideoWriter 객체<pre><code class="language-python">cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor=None) -&gt; retval</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="비디오-파일이-준비되었는지-확인">비디오 파일이 준비되었는지 확인</h3>
<pre><code class="language-python">cv2.VideoWriter.isOpened() -&gt; retval</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="프레임-저장하기">프레임 저장하기</h3>
<pre><code class="language-python">cv2.VideoWriter.write(image) -&gt; None</code></pre>
</li>
<li>image: 저장할 프레임(numpy.ndarray)<h3 id="예제">예제</h3>
<pre><code class="language-python">import cv2
</code></pre>
</li>
</ul>
<p>cap = cv2.VideoCapture(0)</p>
<p>w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*&#39;DIVX&#39;) # *&#39;DIVX&#39; == &#39;D&#39;, &#39;I&#39;, &#39;V&#39;, &#39;X&#39;
delay = round(1000 / fps)
out = cv2.VideoWriter(&#39;output.avi&#39;, fourcc, fps, (w, h))</p>
<p>while True:
    ret, frame = cap.read()</p>
<pre><code>out.write(frame)

cv2.imshow(&#39;frame&#39;, frame)

if cv2.waitKey(delay) == 27:
    break</code></pre><h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카메라와 동영상 처리하기]]></title>
            <link>https://velog.io/@one_step/%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%99%80-%EB%8F%99%EC%98%81%EC%83%81-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@one_step/%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%99%80-%EB%8F%99%EC%98%81%EC%83%81-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 Jun 2023 06:10:06 GMT</pubDate>
            <description><![CDATA[<h2 id="cv2videocapture-클래스">cv2.VideoCapture 클래스</h2>
<ul>
<li>OpenCV에서는 카메라와 동영상으로부터 프레임(frame)을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리함<h2 id="첫-번째-방법">첫 번째 방법</h2>
<h3 id="카메라열기">카메라열기</h3>
<pre><code class="language-python">cv2.VideoCapture(index, apiPreference=None) -&gt; retval</code></pre>
</li>
<li>index: camera_id+ domain_offset_id
시스템 기본 카메라를 기본 방법으로 열려면 index에 0을 전달</li>
<li>apiPreference: 선호하는 카메라 처리방법을 지정</li>
<li>retval:cv2.VideoCapture 객체<pre><code class="language-python">cv2.VideoCapture.open(index, apiPreference=None) -&gt; retval</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="비디오-캡쳐가-준비되었는지-확인">비디오 캡쳐가 준비되었는지 확인</h3>
<pre><code class="language-python">cv2.VideoCapture.isOpened() -&gt; retval</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="프레임-받아오기">프레임 받아오기</h3>
<pre><code class="language-python">cv2.VideoCapture.read(image=None) -&gt; retval, image</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.</li>
<li>image: 현재 프레임(numpy.ndarray)<h3 id="예제">예제</h3>
<pre><code class="language-python">import sys
import cv2

</code></pre>
</li>
</ul>
<h1 id="기본-카메라-장치-열기">기본 카메라 장치 열기</h1>
<p>cap = cv2.VideoCapture(0)</p>
<p>if not cap.isOpened():
    print(&#39;camera open failed!&#39;)
    sys.exit()</p>
<h1 id="카메라-프레임-처리">카메라 프레임 처리</h1>
<p>while True:</p>
<h1 id="카메라로부터-프레임을-정상적으로-받아오면-ret에는-true-frame에는-해당프레임이-저장됨">카메라로부터 프레임을 정상적으로 받아오면 ret에는 True, frame에는 해당프레임이 저장됨.</h1>
<pre><code>ret, frame = cap.read()

if not ret:
    break
# 그레이 스케일로 변환
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow(&#39;frame&#39;, frame)
cv2.imshow(&#39;gray&#39;, gray)

# 일정시간(e.g. 10ms) 기다린 후 다음 프레임 처리. 만약 ESC 키를 누르면 while 루프 종료.
if cv2.waitKey(1) == 27:  # ESC
    break</code></pre><p>cap.release() # 사용한 자원 해제
cv2.destroyAllWindows()</p>
<pre><code>## 두 번째 방법
### 동영상, 정지영상시퀀스, 비디오스트림 열기
```python
cv2.VideoCapture(filename, apiPreference=None) -&gt; retval</code></pre><ul>
<li>filename: 비디오 파일 이름, 정지 영상 시퀀스, 비디오 스트림 URL 등
(e.g) &#39;video.avi&#39;, &#39;img_%02d.jpg’, &#39;protocol://host:port/script?params|auth&#39;</li>
<li>apiPreference: 선호하는 동영상 처리 방법을 지정</li>
<li>retval: cv2.VideoCapture 객체<pre><code class="language-python">cv2.VideoCapture.open(filename, apiPreference=None) -&gt; retval</code></pre>
</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="카메라-비디오-장치-속성-값-참조">카메라, 비디오 장치 속성 값 참조</h3>
<pre><code class="language-python">cv2.VideoCapture.get(propId) -&gt; retval</code></pre>
</li>
<li>propId: 속성 상수. (<a href="https://docs.opencv.org/4.1.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d">OpenCV문서</a>참조)</li>
<li>retval: 성공하면 해당 속성값, 실패하면 0.<pre><code class="language-python">cv2.VideoCapture.set(propId, value) -&gt; retval</code></pre>
</li>
<li>propId: 속성 상수</li>
<li>value: 속성 값</li>
<li>retval: 성공하면 True, 실패하면 False.<h3 id="예제-1">예제</h3>
<pre><code class="language-python"># 비디오 파일 열기
cap = cv2.VideoCapture(&#39;video1.mp4&#39;)
</code></pre>
</li>
</ul>
<h1 id="초당-프레임-수">초당 프레임 수</h1>
<p>fps = cap.get(cv2.CAP_PROP_FPS)</p>
<p>delay = round(1000 / fps)</p>
<h1 id="비디오-매-프레임-처리">비디오 매 프레임 처리</h1>
<p>while True:
    ret, frame = cap.read()</p>
<pre><code>if not ret:
    break

# 그레이 스케일 변환
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow(&#39;frame&#39;, frame)
cv2.imshow(&#39;gray&#39;, gray)

if cv2.waitKey(delay) == 27:
    break</code></pre><p>cap.release()
cv2.destroyAllWindows()</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenCV 그리기 함수]]></title>
            <link>https://velog.io/@one_step/OpenCV-%EA%B7%B8%EB%A6%AC%EA%B8%B0-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@one_step/OpenCV-%EA%B7%B8%EB%A6%AC%EA%B8%B0-%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 28 Jun 2023 05:49:09 GMT</pubDate>
            <description><![CDATA[<h2 id="opencv-그리기-함수">OpenCV 그리기 함수</h2>
<ul>
<li>OpenCV는 영상에선, 도형, 문자열을 출력하는 그리기 함수를 제공</li>
<li>선그리기: 직선, 화살표, 마커등</li>
<li>도형그리기: 사각형, 원, 타원, 다각형등</li>
<li>문자열출력<h3 id="그리기-함수-사용-시-주의할-점">그리기 함수 사용 시 주의할 점</h3>
</li>
<li>그리기 알고리즘을 이용하여 영상의 픽셀값 자체를 변경<ul>
<li>원본 영상이 필요하면 복사본을 만들어서 그리기&amp; 출력</li>
</ul>
</li>
<li>그레이 스케일 영상에는 컬러로 그리기 안됨<ul>
<li>cv2.cvtColor() 함수로 BGR 컬러영상으로 변환한 후 그리기 함수 호출<h2 id="그리기-함수-종류">그리기 함수 종류</h2>
<h3 id="직선-그리기">직선 그리기</h3>
<pre><code class="language-python">cv2.line(img, pt1, pt2, color, thickness=None, lineType=None,
shift=None) -&gt; img</code></pre>
</li>
</ul>
</li>
<li>img: 그림을 그릴 영상</li>
<li>pt1, pt2: 직선의 시작점과 끝점. (x, y) 튜플.</li>
<li>color: 선 색상 또는 밝기. (B, G, R) 튜플 또는 정수값.</li>
<li>thickness: 선두께. 기본값은 1.</li>
<li>lineType: 선타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택. 기본값은cv2.LINE_8.</li>
<li>shift: 그리기 좌표값의 축소 비율. 기본값은 0.<h3 id="사각형그리기">사각형그리기</h3>
<pre><code class="language-python">cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None,
shift=None) -&gt; img
cv2.rectangle(img, rec, color, thickness=None, lineType=None,
shift=None) -&gt; img</code></pre>
</li>
<li>img:그림을 그릴 영상</li>
<li>pt1, pt2: 사각형의 두 꼭지점 좌표. (x, y) 튜플.</li>
<li>rec: 사각형 위치 정보. (x, y, w, h) 튜플.</li>
<li>color: 선 색상 또는 밝기. (B, G, R) 튜플 또는 정수값.</li>
<li>thickness: 선 두께. 음수(-1)를 지정하면 내부를 채움.기본값은 1.</li>
<li>lineType: 선타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택. 기본값은 cv2.LINE_8.</li>
<li>shift: 그리기 좌표값의 축소 비율. 기본값은 0.<h3 id="원그리기">원그리기</h3>
<pre><code class="language-python">cv2.circle(img, center, radius, color, thickness=None, lineType=None,
shift=None) -&gt; img</code></pre>
</li>
<li>img: 그림을 그릴 영상</li>
<li>center: 원의 중심 좌표. (x, y) 튜플.</li>
<li>radius: 원의 반지름</li>
<li>color:선 색상 또 는밝기. (B, G, R) 튜플 또는 정수값.</li>
<li>thickness: 선 두께. 음수(-1)를 지정하면 내부를 채움.기본값은 1.</li>
<li>lineType: 선타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택. 기본값은 cv2.LINE_8.</li>
<li>shift: 그리기 좌표값의 축소 비율. 기본값은 0.<h3 id="다각형-그리기">다각형 그리기</h3>
<pre><code class="language-python">cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None,
shift=None) -&gt; img</code></pre>
</li>
<li>img:그림을그릴영상</li>
<li>pts:다각형 외곽점들의 좌표 배열. numpy.ndarray의 리스트
(e.g.) [np.array([[10,10],[50,50],[10,50]],dtype=np.int32)]</li>
<li>isClosed: 폐곡선 여부. True 또는False 지정.</li>
<li>color: 선 색상 또 는밝기. (B, G, R) 튜플 또는 정수값.</li>
<li>thickness: 선 두께. 음수(-1)를 지정하면 내부를 채움.기본값은 1.</li>
<li>lineType: 선 타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택. 기본값은 cv2.LINE_8.</li>
<li>shift: 그리기 좌표값의 축소 비율. 기본값은 0.<h3 id="문자열-출력">문자열 출력</h3>
<pre><code class="language-python">cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None,
lineType=None, bottomLeftOrigin=None) -&gt; img</code></pre>
</li>
<li>img: 그림을 그릴 영상</li>
<li>text: 출력할 문자열</li>
<li>org: 영상에서 문자열을 출력할 위치의 좌측 하단좌표. (x, y) 튜플.</li>
<li>fontFace: 폰트종류. cv2.FONT_HERSHEY_ 로시작하는 상수 중 선택</li>
<li>fontScale: 폰트 크기 확대/축소 비율</li>
<li>color: 선 색상 또 는밝기. (B, G, R) 튜플 또는 정수값.</li>
<li>thickness: 선 두께. 음수(-1)를 지정하면 내부를 채움.기본값은 1.</li>
<li>lineType: 선타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA  중 선택.</li>
<li>bottomLeftOrigin: True이면 영상의 좌측 하단을 원점으로 간주. 기본값은False.</li>
</ul>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마스크 연산 & PNG 합성]]></title>
            <link>https://velog.io/@one_step/%EB%A7%88%EC%8A%A4%ED%81%AC-%EC%97%B0%EC%82%B0-PNG-%ED%95%A9%EC%84%B1</link>
            <guid>https://velog.io/@one_step/%EB%A7%88%EC%8A%A4%ED%81%AC-%EC%97%B0%EC%82%B0-PNG-%ED%95%A9%EC%84%B1</guid>
            <pubDate>Wed, 28 Jun 2023 05:35:53 GMT</pubDate>
            <description><![CDATA[<h2 id="마스크-연산과-roi">마스크 연산과 ROI</h2>
<h3 id="관심영역roi">관심영역(ROI)</h3>
<ul>
<li>Region of Interest</li>
<li>영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역<h3 id="마스크연산">마스크연산</h3>
</li>
<li>OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상(mask image)을 인자로 함께 전달해야함<ul>
<li>(e.g.) cv2.copyTo(), cv2.calcHist(), cv2.bitwise_or(), cv2.matchTemplate(), etc.</li>
</ul>
</li>
<li>마스크 영상은 cv2.CV_8UC1 타입(그레이 스케일 영상)</li>
<li>마스크 영상의 픽셀값이 0이 아닌 위치에서만 연산이 수행됨 <ul>
<li>보통 마스크 영상으로는 0 또는255로 구성된 이진영상(binary image)을 사용<h3 id="마스크-연산을-지원하는-픽셀값-복사-함수">마스크 연산을 지원하는 픽셀값 복사 함수</h3>
<pre><code class="language-python">cv2.copyTo(src, mask, dst=None) -&gt; dst</code></pre>
</li>
</ul>
</li>
<li>src: 입력 영상</li>
<li>mask: 마스크 영상. cv2.CV_8U. (numpy.uint8)0이 아닌 픽셀에대해서만 복사 연산을 수행.</li>
<li>dst: 출력 영상. 만약 src와 크기및 타입이 같은 dst를 입력으로 지정하면 dst를 새로 생성하지 않고 연산을 수행.그렇지않으면 dst를 새로 생성하여 연산을 수행한 후 반환함.</li>
<li><strong>src, mask, dst는모두크기가같아야함. src와 dst는 같은 타입이어야 하고, mask는 그레이 스케일 타입의 이진 영상.</strong><pre><code class="language-python">src = cv2.imread(&#39;airplane.bmp&#39;, cv2.IMREAD_COLOR)
mask = cv2.imread(&#39;mask_plane.bmp&#39;, cv2.IMREAD_GRAYSCALE)
dst = cv2.imread(&#39;field.bmp&#39;, cv2.IMREAD_COLOR)
</code></pre>
</li>
</ul>
<h1 id="numpy의-불리언-인덱싱booleanindexing을-이용한-마스크-연산">NumPy의 불리언 인덱싱(booleanindexing)을 이용한 마스크 연산</h1>
<p>dst[mask &gt; 0] = src[mask &gt; 0]</p>
<pre><code>## 투명한 PNG 파일 합성하기
```python
import sys
import cv2


# 알파 채널을 마스크 영상으로 이용
src = cv2.imread(&#39;cat.bmp&#39;, cv2.IMREAD_COLOR)
logo = cv2.imread(&#39;opencv-logo-white.png&#39;, cv2.IMREAD_UNCHANGED)

if src is None or logo is None:
    print(&#39;Image load failed!&#39;)
    sys.exit()

mask = logo[:, :, 3]    # mask는 알파 채널로 만든 마스크 영상
logo = logo[:, :, 0:3]  # logo는 b, g, r 3채널로 구성된 컬러 영상
h, w = mask.shape[:2]
crop = src[10:10+h, 10:10+w]  # logo, mask와 같은 크기의 부분 영상 추출

# logo, mask, crop은 모두 크기가 같아야함.logo와crop는 같은 타입이어야 하고, mask는 그레이 스케일 타입의 이진영상.
cv2.copyTo(logo, mask, crop)
#crop[mask &gt; 0] = logo[mask &gt; 0]</code></pre><hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[부분 영상 다루기]]></title>
            <link>https://velog.io/@one_step/%EB%B6%80%EB%B6%84-%EC%98%81%EC%83%81-%EB%8B%A4%EB%A3%A8%EA%B8%B0</link>
            <guid>https://velog.io/@one_step/%EB%B6%80%EB%B6%84-%EC%98%81%EC%83%81-%EB%8B%A4%EB%A3%A8%EA%B8%B0</guid>
            <pubDate>Wed, 28 Jun 2023 05:24:35 GMT</pubDate>
            <description><![CDATA[<h2 id="부분-영상-추출">부분 영상 추출</h2>
<pre><code class="language-python">import numpy as np
import cv2

img1 = cv2.imread(&#39;HappyFish.jpg&#39;)

img2 = img1[40:120, 30:150]  # numpy.ndarray의 슬라이싱
img3 = img1[40:120, 30:150].copy()

img2.fill(0)</code></pre>
<h2 id="부분-영상-처리">부분 영상 처리</h2>
<ul>
<li><code>cv2.add(src1, src2, dst=None, mask=None, dtype=None) -&gt; dst</code></li>
<li>src1: (입력) 첫 번째 영상 또는 스칼라</li>
<li>src2: (입력) 두 번째 영상 또는 스칼라</li>
<li>dst: (출력) 덧셈 연산의 결과 영상</li>
<li>mask: 마스크 영상</li>
<li>dtype: 출력 영상(dst)의 타입. (e.g.) cv2.CV_8U, cv2.CV_32F 등 (cv 자료형 타입으로 입력)<pre><code class="language-python">img = cv2.imread(&#39;lenna.bmp&#39;, cv2.IMREAD_GRAYSCALE)
</code></pre>
</li>
</ul>
<p>img_face = img[200:400, 200:400]  # 얼굴 영역
cv2.add(img_face, 50, img_face)   # 밝기 조절</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료
2) <a href="https://deep-learning-study.tistory.com/115">https://deep-learning-study.tistory.com/115</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[영상의 생성과 복사]]></title>
            <link>https://velog.io/@one_step/%EC%98%81%EC%83%81%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%EB%B3%B5%EC%82%AC</link>
            <guid>https://velog.io/@one_step/%EC%98%81%EC%83%81%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%EB%B3%B5%EC%82%AC</guid>
            <pubDate>Wed, 28 Jun 2023 05:19:19 GMT</pubDate>
            <description><![CDATA[<h2 id="새-영상-생성하기">새 영상 생성하기</h2>
<pre><code class="language-python">numpy.empty(shape, dtype=float, ...) -&gt; arr
numpy.zeros(shape, dtype=float, ...) -&gt; arr
numpy.ones(shape, dtype=None, ...) -&gt; arr
numpy.full(shape, fill_value, dtype=None, ...) -&gt; arr</code></pre>
<ul>
<li>shape:각 차원의 크기. (h, w) 또는(h, w, 3)</li>
<li>dtype:원소의 데이터타입. 일반적인 영상이면 numpy.uint8 지정</li>
<li>arr:생성된 영상(numpy.ndarray)</li>
<li>참고사항:<ul>
<li>numpy.empty() 함수는 임의의 값으로 초기화된 배열을 생성</li>
<li>numpy.zeros() 함수는 0으로 초기화된 배열을 생성</li>
<li>numpy.ones() 함수는 1로 초기화된 배열을 생성</li>
<li>numpy.full() 함수는 fill_value로 초기화된 배열을 생성<pre><code class="language-python">img1 = np.empty((240, 320), dtype=np.uint8)       # grayscale image
img2 = np.zeros((240, 320, 3), dtype=np.uint8)    # color image
img3 = np.ones((240, 320), dtype=np.uint8) * 255  # white
img4 = np.full((240, 320, 3), (0, 255, 255), dtype=np.uint8)  # yellow</code></pre>
<h2 id="영상-복사">영상 복사</h2>
<pre><code class="language-python">img1 = cv2.imread(&#39;HappyFish.jpg&#39;)
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="얕은-복사">얕은 복사</h1>
<p>img2 = img1</p>
<h1 id="깊은-복사">깊은 복사</h1>
<p>img3 = img1.copy()</p>
<h1 id="같은-이미지">같은 이미지</h1>
<p>cv2.imshow(&#39;img1&#39;, img1)
cv2.imshow(&#39;img2&#39;, img2)
cv2.imshow(&#39;img3&#39;, img3)</p>
<hr>
<p>img1[:, :, :] = 255</p>
<h1 id="1-2-빈-이미지-3-원본-이미지">1, 2 빈 이미지 3 원본 이미지</h1>
<p>cv2.imshow(&#39;img1&#39;, img1)
cv2.imshow(&#39;img2&#39;, img2)
cv2.imshow(&#39;img3&#39;, img3)</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[영상 데이터의 속성]]></title>
            <link>https://velog.io/@one_step/%EC%98%81%EC%83%81-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@one_step/%EC%98%81%EC%83%81-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Wed, 28 Jun 2023 05:13:05 GMT</pubDate>
            <description><![CDATA[<ul>
<li>OpenCV는 영상 데이터를 <strong>numpy.ndarray</strong>로 표현</li>
<li>ndim: 차원수. len(img.shape)과같음.</li>
<li>shape: 각 차원의크기. (h, w) 또는(h, w, 3)</li>
<li>size:전체 원소 개수</li>
<li>dtype:원소의 데이터타입. 영상 데이터는 uint8.</li>
<li>그레이 스케일 영상: cv2.CV_8UC1 → numpy.uint8, shape = (h, w)</li>
<li>컬러 영상: cv2.CV_8UC3 → numpy.uint8, shape = (h, w, 3)</li>
<li>OpenCV 영상 데이터 자료형과 NumPy 자료형
<img src="https://velog.velcdn.com/images/one_step/post/c5a83213-81a0-4513-9d83-742184e53c32/image.png" alt=""><pre><code class="language-python">print(&#39;type(img1):&#39;,type(img1)) #type(img1):&lt;class&#39;numpy.ndarray&#39;&gt;
print(&#39;img1.shape:&#39;,img1.shape) #img1.shape:(480,640)
print(&#39;img2.shape:&#39;,img2.shape) #img2.shape:(480,640,3)
print(&#39;img2.dtype:&#39;,img2.dtype) #img2.dtype:uint8</code></pre>
</li>
</ul>
<hr>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Matplotlib을 이용한 영상 출력]]></title>
            <link>https://velog.io/@one_step/Matplotlib%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%98%81%EC%83%81-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@one_step/Matplotlib%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%98%81%EC%83%81-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Wed, 28 Jun 2023 05:06:42 GMT</pubDate>
            <description><![CDATA[<h2 id="matplotlib으로-컬러-영상-출력하기">Matplotlib으로 컬러 영상 출력하기</h2>
<ul>
<li>OpenCV에서 불러온 컬러 영상 데이터는 <code>BGR</code> 순서이지만, Matplotlib는 영상 데이터의 색상 순서가 <code>RGB</code> 순서라고 간주함
→ cv2.cvtColor() 함수 이용하여 색상 순서를 변경해야함<h2 id="matplotlib으로-그레이-스케일-영상-출력하기">Matplotlib으로 그레이 스케일 영상 출력하기</h2>
</li>
<li>plt.imshow() 함수에서 컬러맵을 <code>cmap=&#39;gray&#39;</code> 으로 지정해야함<pre><code class="language-python">import matplotlib.pyplot as plt
import cv2

</code></pre>
</li>
</ul>
<p># 컬러 영상 출력
imgBGR = cv2.imread(&#39;cat.bmp&#39;)
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)</p>
<p>plt.axis(&#39;off&#39;)
plt.imshow(imgRGB)
plt.show()</p>
<p># 그레이스케일 영상 출력
imgGray = cv2.imread(&#39;cat.bmp&#39;, cv2.IMREAD_GRAYSCALE)</p>
<p>plt.axis(&#39;off&#39;)
plt.imshow(imgGray, cmap=&#39;gray&#39;)
plt.show()</p>
<h1 id="두-개의-영상을-함께-출력">두 개의 영상을 함께 출력</h1>
<p>plt.subplot(121), plt.axis(&#39;off&#39;), plt.imshow(imgRGB)
plt.subplot(122), plt.axis(&#39;off&#39;), plt.imshow(imgGray, cmap=&#39;gray&#39;)
plt.show()</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenCV 주요 함수 사용법]]></title>
            <link>https://velog.io/@one_step/OpenCV-%EC%A3%BC%EC%9A%94-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@one_step/OpenCV-%EC%A3%BC%EC%9A%94-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Wed, 28 Jun 2023 05:02:16 GMT</pubDate>
            <description><![CDATA[<ul>
<li>OpenCV 도움말사이트(4.x 버전): <a href="https://docs.opencv.org/4.x/">https://docs.opencv.org/4.x/</a><h2 id="영상-파일-불러오기">영상 파일 불러오기</h2>
<pre><code class="language-python">cv2.imread(filename, flags=None) -&gt; retval</code></pre>
</li>
<li><code>filename</code>: 불러올 영상 파일 이름(문자열)</li>
<li><code>flags</code>: 영상 파일 불러오기 옵션 플래그<ul>
<li>cv2.IMREAD_COLOR: BGR 컬러 영상으로 읽기(기본값)
shape = (rows, cols, 3)</li>
<li>cv2.IMREAD_GRAYSCALE: 그레이 스케일 영상으로 읽기
shape = (rows, cols)</li>
<li>cv2.IMREAD_UNCHANGED: 영상 파일 속성 그대로 읽기
(e.g.) 투명한PNG 파일:shape = (rows, cols, 4)</li>
</ul>
</li>
<li>retval(retrun value):불러온 영상 데이터(numpy.ndarray)<h2 id="영상-파일-저장하기">영상 파일 저장하기</h2>
<pre><code class="language-python">cv2.imwrite(filename, img, params=None) -&gt; retval</code></pre>
</li>
<li><code>filename</code>: 저장할 영상 파일 이름(문자열)</li>
<li><code>img</code>: 저장할 영상 데이터(numpy.ndarray)</li>
<li><code>params</code>: 파일저장옵션지정(속성&amp; 값의정수쌍)
e.g) [cv2.IMWRITE_JPEG_QUALITY, 90] : JPG파일압축률을90%로지정</li>
<li>retval: 정상적으로 저장하면 True, 실패하면 False.<h2 id="새-창-띄우기">새 창 띄우기</h2>
<pre><code class="language-python">cv2.namedWindow(winname, flags=None) -&gt; None</code></pre>
</li>
<li>winname:창 고유 이름(문자열)</li>
<li>flags:창 속성 지정 플래그<ul>
<li>cv2.WINDOW_NORMAL: 영상 크기를 창 크기에 맞게 지정</li>
<li>cv2.WINDOW_AUTOSIZE: 창 크기를 영상 크기에 맞게 변경(기본값)<h2 id="창-닫기">창 닫기</h2>
<pre><code class="language-python">cv2.destroyWindow(winname)-&gt;None
cv2.destroyAllWindows()-&gt;None</code></pre>
</li>
</ul>
</li>
<li>winname: 닫고자 하는 창 이름</li>
<li>참고사항<ul>
<li>cv2.destroyWindow() 함수는 지정한 창 하나만 닫고</li>
<li>cv2.destroyAllWindows() 함수는 열려있는 모든 창을 닫음</li>
<li>일반적인 경우 프로그램 종료 시 운영체제에 의해 열려있는 모든 창이 자동으로 닫힘<h2 id="영상-출력-하기">영상 출력 하기</h2>
<pre><code class="language-python">cv2.imshow(winname, mat) -&gt; None</code></pre>
</li>
</ul>
</li>
<li>winname: 영상을 출력할 대상 창 이름</li>
<li>mat: 출력할 영상 데이터(numpy.ndarray)</li>
<li>참고사항<ul>
<li>uint16, int32 자료형 행렬의경우, 행렬 원소값을 255로 나눠서출력</li>
<li>float32, float64 자료형 행렬의경우, 행렬 원소값에 255를 곱해서출력</li>
<li>만약 winname에 해당하는 창이 없으면 창을 새로 만들어서 영상을출력함</li>
<li>Windows 운영체제에서는 Ctrl + C (복사), Ctrl + S (저장) 지원</li>
<li>실제로는 cv2.waitKey() 함수를 호출해야 화면에 영상이 나타남<h2 id="키보드-입력-대기">키보드 입력 대기</h2>
<pre><code class="language-python">cv2.waitKey(delay=None) -&gt; retval</code></pre>
</li>
</ul>
</li>
<li>delay: 밀리초 단위 대기시간. delay ≤0 이면 무한히 기다림. 기본값은0.</li>
<li>retval: 눌린키 값(ASCII code). 키가 눌리지 않으면-1.</li>
<li>참고사항<ul>
<li>cv2.waitKey() 함수는 OpenCV 창이 하나라도 있을때 동작함</li>
<li>특정키 입력을 확인하려면 ord() 함수를 이용</li>
<li>주요 특수 키코드: 27(ESC), 13(ENTER), 9(TAB)<pre><code class="language-python">while True:
if cv2.waitKey()==ord(&#39;q&#39;):
    break</code></pre>
<h3 id="예제">예제</h3>
<pre><code class="language-python">import sys
import cv2

</code></pre>
</li>
</ul>
</li>
</ul>
<p>img = cv2.imread(&#39;cat.bmp&#39;)</p>
<p>if img is None:
    print(&#39;image load failed!&#39;)
    sys.exit()</p>
<p>cv2.namedWindow(&#39;image&#39;)
cv2.imshow(&#39;image&#39;, img)
cv2.waitKey()
cv2.destroyWindow(&#39;image&#39;)</p>
<h2 id="">```</h2>
<blockquote>
<p>Reference</p>
</blockquote>
<p>1) 제로베이스 데이터스쿨 강의자료</p>
]]></description>
        </item>
    </channel>
</rss>