图像的加载+修改+显示+保存(第一天)

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

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

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

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

 1 #include
 2 #include 
 3 //#include //
 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
 2 #include 
 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
#include 
#include 
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 
 2 #include 
 3 #include 
 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 }

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

你可能感兴趣的:(图像的加载+修改+显示+保存(第一天))