zoukankan      html  css  js  c++  java
  • 图像的加载+修改+显示+保存(第一天)

    去年就学过一段时间Opencv,不过长时间不用就生疏了,现在学习加记录一些,加深印象的同时也可以加深理解。

    1 imread()//图片载入
    2 cvtcolor()//图片修改颜色---新版本
    3 cvcvtcolor()//图片修改颜色---旧版本
    4 imshow()//图片显示
    5 imwrite()//图片保存

    //Opencv里面显示图像的顺序是BGR,正常的软件都是RGB,这里的原因官网说是为了速度更快,但是没人知道为什么这样加载速度快,就当做一种习惯吧!显示的时候注意一下就好。

    旧版本:运行奔溃,最好别用老版本的函数,数据转换太麻烦

     1 #include<iostream>
     2 #include <opencv2/highgui/highgui.hpp>
     3 //#include <opencv2/opencv.hpp>//
     4 using namespace cv;
     5 int main(int argc,char**argv)
     6 {
     7     Mat input_image = imread("9.jpg");
     8     namedWindow("test",WINDOW_AUTOSIZE);
     9     if (input_image.empty()) return -1;
    10     imshow("test",input_image);
    11     waitKey(0);
    12     const CvArr*src = (CvArr*)&input_image;//Mat->CvArr
    13     CvArr *output_image = &src;
    14     namedWindow("output", WINDOW_AUTOSIZE);
    15     cvCvtColor(src, output_image,CV_BGR2GRAY);//这里老是奔溃,原因应该是格式不匹配,看源代码的Assert处编译不通过
    16 
    17     //Mat m = cvarrToMat(output_image, true);//Mat->CvArr
    18 19 //imshow("output", m); 20 waitKey(0); 21 return 0; 22 }

    新版本:很简单的编译通过

     1 #include<iostream>
     2 #include <opencv2/opencv.hpp>
     3 using namespace cv;
     4 int main(int argc,char**argv)
     5 {
     6     Mat input_image = imread("9.jpg");
     7     namedWindow("test",WINDOW_AUTOSIZE);
     8     if (input_image.empty()) return -1;
     9     imshow("test",input_image);
    10     waitKey(0);
    11     Mat output_image;
    12     cvtColor(input_image,output_image,CV_BGR2GRAY);
    13     namedWindow("output", WINDOW_AUTOSIZE);
    14     imshow("output", output_image);
    15     waitKey(0);
    16     return 0;
    17 }

    源代码:旧代码转换格式之后直接调用新代码Mat类,所以根本没必要用旧代码了

    1 1 cvCvtColor( const CvArr* srcarr, CvArr* dstarr, int code )
    2 2 {
    3 3     cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0;
    4 4     CV_Assert( src.depth() == dst.depth() );
    5 5 
    6 6     cv::cvtColor(src, dst, code, dst.channels());
    7 7     CV_Assert( dst.data == dst0.data );
    8 8 }

     图片保存:debug模式下imwrite()函数崩溃,保存的图片是0KB,在release模式下成功编译!这是编译器的问题。

                  使用自己手动添加的配置不会出现这个原因,半自动的添加时有问题的。

    #include<iostream>
    #include <opencv2/opencv.hpp>
    #include <math.h>
    using namespace cv;
    int main(int argc, char**argv)
    {
        Mat input_image = imread("9.jpg");
        
        namedWindow("test", WINDOW_AUTOSIZE);
        if (input_image.empty()) return -1;
        imshow("test", input_image);
        waitKey(1);
        Mat output_image;
        cvtColor(input_image, output_image, CV_BGR2GRAY);
        namedWindow("output", WINDOW_AUTOSIZE);
        imshow("output", output_image);
        imwrite("1.jpg", input_image);
        waitKey(0);
        return 0;
    }

     批量读取照片:

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 #include <windows.h>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 void readImgNamefromFile(char* fileName, vector<string>& imgNames);
     9 int main(int argc, char**argv)
    10 {
    11     /*Mat input_image, output_image;
    12     input_image = imread("1.jpg");
    13 
    14     if (input_image.data == NULL) {
    15         return -1; cout << "can't open image.../";
    16     }*/
    17     char* fileName = "G:/test/";
    18     vector<string> imgNames;
    19     readImgNamefromFile(fileName,imgNames);
    20     for (size_t i = 0; i < imgNames.size(); i++)
    21     {
    22         Mat img = imread(imgNames[i]);
    23         if (!img.data)
    24             return -1;
    25         imshow("im", img);
    26         waitKey(0);
    27 
    28     }
    29     
    30     /*imshow("input_image2", input_image);
    31     imshow("output_image2", output_image);
    32     waitKey(0);*/
    33     return 0;
    34 }
    35 
    36 void readImgNamefromFile(char* fileName, vector<string>& imgNames)
    37 {
    38     imgNames.clear();
    39     WIN32_FIND_DATA file;
    40     int i = 0;
    41     char tempFilePath[MAX_PATH + 1];
    42     char tempFileName[50];
    43     sprintf(tempFilePath, "%s/*", fileName);
    44     //---------char转化为WCHAR
    45     WCHAR wszClassName[256];
    46     memset(wszClassName, 0, sizeof(wszClassName));
    47     MultiByteToWideChar(CP_ACP, 0, tempFilePath, strlen(tempFilePath) + 1, wszClassName,
    48         sizeof(wszClassName) / sizeof(wszClassName[0]));
    49 
    50     HANDLE handle = FindFirstFile(wszClassName,&file);
    51     if (handle != INVALID_HANDLE_VALUE)
    52     {
    53         FindNextFile(handle, &file);
    54         FindNextFile(handle, &file);
    55         do
    56         {
    57             sprintf(tempFileName,"%s",fileName);
    58             //--------------WCHAR转化为string
    59             wchar_t * wText = file.cFileName;
    60             DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, NULL, 0, NULL, FALSE);// WideCharToMultiByte的运用
    61             char *psText;  // psText为char*的临时数组,作为赋值给std::string的中间变量
    62             psText = new char[dwNum];
    63             WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, psText, dwNum, NULL, FALSE);// WideCharToMultiByte的再次运用        
    64             imgNames.push_back(psText);//-------文件名放到imgNames
    65             delete[]psText;// psText的清除
    66 
    67             imgNames[i].insert(0, tempFileName);
    68             i++;
    69         } while (FindNextFile(handle, &file));
    70     }
    71     FindClose(handle);
    72 }

    。。。。。效果图自己试验~~

  • 相关阅读:
    Android之startActivity、startActivityForResult和setResult详解
    Android之Activity的标准写法参考
    Android之Handler用法总结[一]
    UHF天线知识汇编
    数字图像处理【一】基础理论
    S2SH之简易的Web Service实现
    Java Web开发环境搭建基础[Windows篇]
    Hadoop的安装(Ubuntu 12.10为例)
    【NOIP2016普及组复赛】魔法阵
    【NOIP2016提高A组集训第13场11.11】最大匹配
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/6626405.html
Copyright © 2011-2022 走看看