去年就学过一段时间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 }
。。。。。效果图自己试验~~