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 }

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

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/6626405.html
Copyright © 2011-2022 走看看