Clion的opencv配置以及读取文件方法

如果编译遇到这样的情况:

1,配置

//cmake.txt 配置

cmake_minimum_required(VERSION 3.13)

#引入项目
project(pedestrian_detection)
#引入c++14标准
set(CMAKE_CXX_STANDARD 14)

#找到opencv的包
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

#添加运行文件
add_executable(test test/detection.cpp test/detection.cpp)
add_executable(pedestrian_detection main.cpp main.cpp)

#动态链接(为项目添加动态链接)
target_link_libraries(pedestrian_detection ${OpenCV_LIBS} )
target_link_libraries(test ${OpenCV_LIBS} )

2,测试程序

qr.cpp文件(作用:框出图片中二维码的部分):

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/imgproc/types_c.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace cv;
using namespace std;
Mat src; Mat src_gray;Mat src_out;
RNG rng(12345);

//轮廓中心点
Point Center_point(vector<vector<Point> > contours,int i)//找到所提取轮廓的中心点
   {
          int centerx=0,centery=0,n=contours[i].size();
          //在提取的小正方形的边界上每隔周长个像素提取一个点的坐标,求所提取四个点的平均坐标(即为小正方形的大致中心)
          centerx = (contours[i][n/4].x + contours[i][n*2/4].x + contours[i][3*n/4].x + contours[i][n-1].x)/4;
          centery = (contours[i][n/4].y + contours[i][n*2/4].y + contours[i][3*n/4].y + contours[i][n-1].y)/4;
          Point point1=Point(centerx,centery);
          return point1;
   }

int main( int argc, char** argv[] )
{
  src = imread( "1.jpg", 1 );
//判断是否载入图像
  if(src.empty())
    {
        fprintf(stderr, "Can not load image %s\n", 1);
        return -1;
    }
  Mat src_all=src.clone();
//图像转化为灰度图像
  cvtColor( src, src_gray, CV_BGR2GRAY );//opencv2.x颜色空间转换code用的宏定义是CV_前缀开头,opencv3之后则是COLOR_开头)

//图像滤波和均衡化会影响图像,影响下面轮廓检测
  //medianBlur(src_gray, src_gray, 3); //中值滤波
 // equalizeHist( src_gray, src_gray );//均衡化

  Scalar color = Scalar(1,1,255 );//RGB颜色值分别为1,1,255
  Mat drawing = Mat::zeros( src.size(), CV_8UC3 );//画布
  Mat drawing2 = Mat::zeros( src.size(), CV_8UC3 );//画布
//图像二值化
  Mat src_threshold;
  threshold(src_gray, src_threshold, 112, 255, THRESH_BINARY );//threshold(const Mat& src, Mat& dst, double thresh,double maxVal, int thresholdType );

//对图像进行轮廓检测,调用查找轮廓函数
  vector<vector<Point> > contours,contours2;
  vector<Vec4i> hierarchy;
  findContours( src_threshold, contours, hierarchy,  CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );//CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓内.CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内

    int c=0,ic=0,k=0,area=0,i=0;
//寻找有两个子轮廓的父轮廓
    int parentIdx=-1;
    for( int i = 0; i< contours.size(); i++ )//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数
    {
        if (hierarchy[i][2] != -1 && ic==0)//有子轮廓
        {
            parentIdx = i;
            ic++;
        }
        else if (hierarchy[i][2] != -1)
        {
            ic++;
        }
        else if(hierarchy[i][2] == -1)//无子轮廓
        {
            ic = 0;
            parentIdx = -1;
        }

       //有两个子轮廓
        if ( ic >= 2)
        {
            contours2.push_back(contours[parentIdx]);//保存找到的黑色定位角
            drawContours( drawing, contours, parentIdx,  CV_RGB(255,0,0) , 1, 8);//画出三个黑色定位角的轮廓
            ic = 0;
            parentIdx = -1;
            area = contourArea(contours[i]);//得出一个二维码定位角的面积,以便计算其边长(area_side)
        }
    }
//填充轮廓
    for(int i=0; i<contours2.size(); i++)
        drawContours( drawing2, contours2, i,  CV_RGB(255,0,0) , -1, 4, hierarchy[k][2], 0, Point() );

//获取三个定位角的中心坐标
     Point point[3];
    for(int i=0; i<contours2.size(); i++)
    {
        point[i] = Center_point( contours2, i );
    }
//计算轮廓的面积,计算定位角的面积,从而计算出边长

	area = contourArea(contours2[0]);///
    int area_side = cvRound (sqrt (double(area)));
//连接三个黑色正方形区域,形成一个轮廓
    for(int i=0; i<contours2.size(); i++)
    {
        //三个定位角连线
        line(drawing2,point[i%contours2.size()],point[(i+1)%contours2.size()],CV_RGB(100,100,255),area_side/2,8);
    }


	//框出这整个二维码
	Mat gray_all,src_treshold_all;
	vector<vector<Point> > contours_all;
    vector<Vec4i> hierarchy_all;
	cvtColor( drawing2, gray_all, CV_BGR2GRAY );
	threshold( gray_all, src_treshold_all, 45, 255, THRESH_BINARY );
	findContours( src_treshold_all, contours_all, hierarchy_all,  RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0) );//RETR_EXTERNAL表示只寻找最外层轮廓

 //求最小包围矩形
	 RotatedRect rectPoint = minAreaRect(contours_all[0]);
	 Point2f fourPoint2f[4]; //矩形的质心


	 //将rectPoint变量中存储的坐标值放到 P的数组中
	 rectPoint.points(fourPoint2f);
	  for (int i = 0; i < 4; i++)
        {
            line(src_all, fourPoint2f[i%4], fourPoint2f[(i + 1)%4], Scalar(20,21,237), 3);
        }
	 imshow( "二维码", src_all );
    waitKey(0);
    return(0);
}

创建CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

project(QR)
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
add_executable(qr qr.cpp)
target_link_libraries(qr ${OpenCV_LIBS})

编译执行

cmake .
make
./qr 1.jpg

# 执行结果(没有界面的linux)
(二维码:22837): Gtk-WARNING **: 18:02:43.491: cannot open display:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错,可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值