embedded/opencv

3. 이미지 프로세싱(1)

crab. 2021. 9. 8. 08:07

https://95mkr.tistory.com/entry/OPENCV6?category=750764 

 

[OPENCV] 6. 이미지 프로세싱(2) - 가장자리 검출

☞ 메인보드 : Jetson Nano Developer Kit ☞ 운영 체제 : Ubuntu 18.04 - JetPack 4.4.1 ☞ IDE : Visual Studio Code ☞ 언어 : C++ 목차 ○ 1. Sobel Mask ○ 2. Laplacian ○ 3. Canny ① Sobel Mask 카메라의..

95mkr.tistory.com

앞선 두 과정을 끝냈다면 이제는 있는 코드를 제대로 썼다면 오류는 안 나기 때문에 7 과정을 이번에 다 쓰고 

 

나중에 이론적인 부분들을 잘 이해해서 다시 쓰도록 할 것이며 그럼에도 나온 몇가지 오류들을 정리하겠다.

 

모든 과정은 동일하게 진행된다.

 

우선 workspace폴더를 만들고 그 안에 대표 프로젝트 폴더를 만든다(ex: filtering).

 

그 후 그 폴더 내부에 src폴더를 만들고 src폴더에서 gedit Blur.cpp를

 

Blur폴더에서 gedit CMakeLists.txt 파일을 만들고 cmake.  한 이후에 make를 하고 나온 실행파일을./Blur로 실행시킨다.

 

같은 방식으로 src폴더에 Blur만이 아니라 다른 Bilateral Filter 같은 소스파일을 만들고 CMakeLists.txt 만 위의 사진처럼 추가하고

cmake . 

make

하면 된다. 여기서 주의할 점은

1. "CMakeLists.txt" 파일은 파일 이름이 한 글자도 틀리면 안 된다는 점

2. 참고사이트에서는 가끔 

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

이런 식으로 ""을 썼는데 이건 그 폴더 내에 있는 헤더를 쓰겠다는 의미이므로 우리는 하면 안 되고 저걸 한번 하고 실행하면 다시 <>로 수정한다 해도 안되니 삭제하고 처음부터 진행할 것 (이유는 나중에 알아내야 함) 

이다.

Bilateral Filter

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

int main(int argc, char** argv){
    cv::Mat src = cv::imread("road.jpg");
    if(src.empty()) return -1;

    cv::Mat bilateral;
    cv::bilateralFilter(src, bilateral, 5, 50, 50);
    cv::Mat bilateral1;
    cv::bilateralFilter(src, bilateral1, 5, 100, 100);
    cv::Mat bilateral2;
    cv::bilateralFilter(src, bilateral2, 5, 150, 150);
    
    cv::imshow("original", src);
    cv::imshow("bilateral",bilateral);
    cv::imshow("bilateral1",bilateral1);
    cv::imshow("bilateral2",bilateral2);
    
    cv::waitKey(0);

    return 0;
}

Blur

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

int main(int argc, char** argv){
    cv::Mat src = cv::imread("road.jpg");
    if(src.empty()) return -1;
    
    cv::Mat blur;
    cv::blur(src, blur, cv::Size(3,3));
    cv::Mat blur1;
    cv::blur(src, blur1, cv::Size(5,5));
    cv::Mat blur2;
    cv::blur(src, blur2, cv::Size(7,7));
    
    cv::imshow("original", src);
    cv::imshow("blur",blur);
    cv::imshow("blur1", blur1);
    cv::imshow("blur2",blur2);
    
    cv::waitKey(0);
    
    return 0;
}

Median Blur

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

int main(int argc, char** argv){
    cv::Mat src = cv::imread("road.jpg");
    if(src.empty()) return -1;
    
    cv::Mat median;
    cv::medianBlur(src, median, 3);
    cv::Mat median1;
    cv::medianBlur(src, median1, 5);
    cv::Mat median2;
    cv::medianBlur(src, median2, 7); 
    
    cv::imshow("original", src);
    cv::imshow("median", median);
    cv::imshow("median1", median1);
    cv::imshow("median2", median2);
    
    cv::waitKey(0);
    
    return 0;
}

Gaussian Blur

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

int main(int argc, char** argv){
    cv::Mat src = cv::imread("road.jpg");
    if(src.empty()) return -1;
    
    cv::Mat gaussian;
    cv::GaussianBlur(src, gaussian, cv::Size(3,3), 10);
    cv::Mat gaussian1;
    cv::GaussianBlur(src, gaussian1, cv::Size(5,5), 10);
    cv::Mat gaussian2;
    cv::GaussianBlur(src, gaussian2, cv::Size(7,7), 10);
    
    cv::imshow("original", src);
    cv::imshow("gaussian", gaussian);
    cv::imshow("gaussian1", gaussian1);
    cv::imshow("gaussian2", gaussian2);
    
    cv::waitKey(0);
    
    return 0;
}

Mix

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

int main(int argc, char** argv){
    cv::Mat src = cv::imread("road.jpg");
    if(src.empty()) return -1;
   
    cv::Mat bilateral;
    cv::bilateralFilter(src, bilateral, 5, 50, 50);

    cv::Mat blur;
    cv::blur(src, blur, cv::Size(3,3));

    cv::Mat median;
    cv::medianBlur(src, median, 3);

    int size = 3;
    cv::Mat gaussian;
    cv::GaussianBlur(src, gaussian, cv::Size(size,size), 100);

    cv::imshow("bilateral", bilateral);
    cv::imshow("blur", blur);
    cv::imshow("median", median);
    cv::imshow("gaussian", gaussian);

    cv::waitKey(0);

    return 0;

}

hsv.cpp

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

int main(){

	int width = 600, height = 400;

	cv::Mat img, hsv;
	img = cv::imread("road2.jpg", cv::IMREAD_COLOR);
	cv::cvtColor(img, hsv, cv::COLOR_RGB2HSV);
	if(img.empty()){
		std::cout << "No Image" << std::endl;
		return -1;
	}

	cv::namedWindow("ORIGINAL IMAGE", cv::WINDOW_NORMAL);
	cv::resizeWindow("ORIGINAL IMAGE", width, height);
	cv::imshow("ORIGINAL IMAGE", img);
	
	cv::namedWindow("HSV IMAGE", cv::WINDOW_NORMAL);
	cv::resizeWindow("HSV IMAGE", width, height);
	cv::imshow("HSV IMAGE", hsv);
	
	cv::waitKey(0);
}

※  CMakeLists.txt

cmake_minimum_required(VERSION 2.9)
project(colorModel)
find_package(OpenCV REQUIRED)
add_executable(${PROJECT_NAME} src/hsv.cpp)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
cmake .
make
./colorModel

※  ROI(Region Of  Interest)

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

int main(){

	cv::Mat img, ROI;
	img = cv::imread("road2.jpg", cv::IMREAD_COLOR);
	cv::resize(img, img, cv::Size(600,480));

	if(img.empty()){
		std::cout << "No Image" << std::endl;
		return -1;
	}
	
	ROI = img(cv::Rect(0,250,600,230));

	cv::namedWindow("ORIGINAL IMAGE", cv::WINDOW_NORMAL);
	cv::resizeWindow("ORIGINAL IMAGE",600, 480);

	cv::imshow("ORIGINAL IMAGE", ROI);
    
    	cv::waitKey(0);
}

https://95mkr.tistory.com/entry/OPENCV5?category=750764

※  수정한 코드  

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

int main(){

	cv::Mat img, HSV, ROI;
	img = cv::imread("road2.jpg", cv::IMREAD_COLOR);
	cv::resize(img, img, cv::Size(600,480));

	if(img.empty()){
		std::cout << "No Image" << std::endl;
		return -1;
	}
	
	ROI = img(cv::Rect(0,250,600,230));
	cvtColor(ROI,HSV,cv::COLOR_RGB2HSV);
	
	cv::Scalar lower_white = cv::Scalar(0,0,200);
	cv::Scalar upper_white = cv::Scalar(180,255,255);
	cv::inRange(HSV, lower_white, upper_white, HSV);

	cv::imshow("ORIGINAL IMAGE", ROI);
	cv::imshow("HSV IMAGE", HSV);    
	
	cv::waitKey(0);
}

Sobel Mask

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

int main(){
    cv::Mat src;
    int kernel_size = 3;
    int scale = 1;
    int delta = 0;
    int ddepth = CV_32F;
    
    src = cv::imread("road2.jpg", cv::IMREAD_COLOR);
    cv::resize(src, src, cv::Size(src.cols/2, src.rows/2));
    if(src.empty()){
        std::cout << "Can't Open Image" << std::endl;
        return -1;
    }

    cv::Mat blur, gray;
    cv::bilateralFilter(src, blur, kernel_size, 100, 100); 
    cv::cvtColor(blur, gray, cv::COLOR_BGR2GRAY);
    
    // Sobel Mask
    cv::Mat sobel_x, sobel_y, scharr_x, scharr_y;
    cv::Sobel(gray, sobel_x, ddepth, 1, 0);
    cv::Sobel(gray, sobel_y, ddepth, 0, 1);
    
    // Scharr Filter
    cv::Sobel(gray, scharr_x, cv::FILTER_SCHARR, 1, 0);
    cv::Sobel(gray, scharr_y, cv::FILTER_SCHARR, 0, 1);
    
    cv::imshow("sobel x", sobel_x);
    cv::imshow("sobel y", sobel_y);
    cv::imshow("scharr x", scharr_x);
    cv::imshow("scharr y", scharr_y);
    cv::waitKey(0);

    return 0;
}

Laplacian

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

int main(){
    cv::Mat src;
    int kernel_size = 3;
    int scale = 1;
    int delta = 0;
    int ddepth = CV_16S;
    
    src = cv::imread("road2.jpg", cv::IMREAD_COLOR);
    cv::resize(src, src, cv::Size(src.cols/2, src.rows/2));
    if(src.empty()){
        std::cout << "Can't Open Image" << std::endl;
        return -1;
    }

    cv::Mat blur, gray, dst, abs_dst;
    cv::GaussianBlur(src, blur, cv::Size(3,3), 10);
    cv::cvtColor(blur, gray, cv::COLOR_BGR2GRAY);
    
    cv::Mat dst, abs_dst;
    cv::Laplacian(gray, dst, ddepth, kernel_size, scale, delta, cv::BORDER_DEFAULT);
    cv::convertScaleAbs(dst, abs_dst);

    cv::imshow("reult", abs_dst);
    cv::waitKey(0);

    return 0;
}

Canny

#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

int main(){
    cv::Mat src;
    int kernel_size = 3;
    int ddepth = CV_16S;
    int low_threshold = 150;
    int high_threshold = low_threshold * 2;
    
    src = cv::imread("road2.jpg", cv::IMREAD_COLOR);
    cv::resize(src, src, cv::Size(src.cols/2, src.rows/2));
    if(src.empty()){
        std::cout << "Can't Open Image" << std::endl;
        return -1;
    }

    cv::Mat blur, gray;
    cv::bilateralFilter(src, blur, kernel_size, 100, 100); 
    cv::cvtColor(blur, gray, cv::COLOR_BGR2GRAY);
    
    cv::Mat scharr_x, scharr_y;
    cv::Scharr(gray,scharr_x,ddepth,1,0);
    cv::Scharr(gray,scharr_y,ddepth,0,1);
    
    cv::Mat scharrToCanny, grayToCanny;
    cv::Canny(scharr_x, scharr_y, scharrToCanny, 500, 1000);
    cv::Canny(gray, grayToCanny, low_threshold, high_threshold);
    
    cv::imshow("Canny", scharrToCanny);
    cv::imshow("gray canny",grayToCanny);
    cv::waitKey(0);

    return 0;
}

 

'embedded > opencv' 카테고리의 다른 글

+. 윈도우에서 opencv 설치하고 라이브러리 추가하기  (0) 2021.09.08
5. 이미지 프로세싱(3)  (0) 2021.09.08
4. 이미지 프로세싱(2)  (0) 2021.09.08
2. opencv 실시간 촬영  (0) 2021.09.03
1. opencv로 이미지 출력  (0) 2021.09.03