opencv中Mat_<uchar>的作用

大佬们,
Mat img1= imread(file_name,IMREAD_COLOR);
Mat_ img2(img1);
的作用是啥

c++

1个回答

第一行,声明一个Mat型变量(属于opencv) img1,并以彩色方式读取一幅图像, file name可以是相对地址或者绝对地址.
第二行,声明一个Mat型变量img2,并用img1来初始化img2,所以img1和img2都存贮着读取到的图片

zjh526204825
zjh526204825 回复tangxiaoren: 好的,明白了!谢谢大佬
4 个月之前 回复
tangxiaoren
tangxiaoren 回复zjh526204825: Mat_<uchar>是说明声明的图像是单通道的; 然后后面就是用img1来初始化img2;这就相当于 img1.copyTo(img2); 但是如果你运行这句话是有错误的,原因是两张图的通道数不一样.个人认为你的写法是不合理的,在用img1给img2 赋值之前先保证两个图片的类型相同.
4 个月之前 回复
tangxiaoren
tangxiaoren 回复zjh526204825: Mat_<uchar>是说明声明的图像是单通道的;
4 个月之前 回复
zjh526204825
zjh526204825 谢谢,我第2行写的是“Mat_<uchar>img2(img1);”,但是显示出来的是问题那样的,发出来之后没注意他把我的问题改动了,可以再解释一下第2行嘛!谢谢
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
OpenCV 的 Mat 内存错误?

新学习Mat类型,编示例程序 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; int main(){ Mat image=imread("test.jpg"); imwrite("test1.jpg",image); } 结果运行时出错: “0x76322F71 处(位于 CVTest.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0063FA04 处。” 求教是什么地方出错了? IDE为VS2013,其它环境都设置好了,以前用IplImage也一直没出过问题。

opencv Mat矩阵元素的访问问题

double SAD = 0; Mat temp; temp = l - r; cout << "temp=" << endl; cout << temp << endl; //Mat t; temp = abs(temp); cout << "temp=" << endl; cout << temp << endl; for (int i = 0;i < temp.rows;i++) { uchar *t = temp.ptr<uchar>(i); for (int j=0;j < temp.cols;j++) { SAD = SAD + t[j];///////////这里这里这里 } } return SAD; 为啥我这样访问矩阵元素没成功,我的SAD没得到temp矩阵里面的元素累加和?我已经检验过我的temp矩阵,里面有值 还有: int SAD = 0; Mat temp; temp = l - r; cout << "temp=" << endl; cout << temp << endl; //Mat t; temp = abs(temp); cout << "temp=" << endl; cout << temp << endl; for (int i = 0;i < temp.rows;i++) { //uchar *t = temp.ptr<uchar>(i); for (int j=0;j < temp.cols;j++) { SAD = SAD + temp.at<uchar>(i, j);////中断中断中断 } } return SAD; 我用at函数会中断是怎么回事

OpenCV转换到lab颜色空间的CV_32F类型Mat图像分通道处理uchar指针和float数据

转换到lab颜色空间CV-32F类型Mat图像,需要分通道处理,3个通道,l、a、b都是CV-32F类型的Mat数据,使用uchar指针进行像素访问,并将3个通道处理结果赋值给一个新的CV-32F类型Mat图像testSal。问题是3个通道的处理结果仍是float型,赋值给uchar指针指向的对象可能会存在数据精度损失,在调试的过程中发现数据的值有问题,麻烦高人指点下怎么解决,万分感激。 ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222898_698633.jpg) ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222897_674168.jpg) ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222923_467629.jpg)

arm opencv mat内存无法释放

我是在arm上运行的,我的测试代码如下: ``` #include<stdio.h> #include <opencv2/opencv.hpp> #include <opencv2/contrib/contrib.hpp> #include <string> using namespace cv; using namespace std; int main(int argc ,char* argv[]) { vector<Mat> matVec; //Mat tmpMat; IplImage* src; for(int i=0;i<100;++i) { Mat tmpMat; tmpMat.create(cvSize(256,256),CV_8UC1); for(int j=0;j<256;++j) for(int k=0;k<256;++k) { tmpMat.at<uchar>(j,k)=(i+j)%255; } matVec.push_back(tmpMat.clone()); } int index=100; system("free"); printf("Press any key to stop!"); getchar(); while(index>1) { matVec.at(index-1).release(); --index; } matVec.clear(); vector<Mat>(matVec).swap(matVec); system("free"); printf("Press any key to stop!"); getchar(); return 0; } ``` 运行效果如下图: ![图片说明](https://img-ask.csdn.net/upload/201506/15/1434338371_412530.jpg) 释放前后,内存并没有太大变化。我感到很困惑,这是什么原因呢?

OPENCV Mat类怎么对像素进行操作啊?

Mat srcImage = imread("1.jpg", 0); Mat dstImage; dstImage=srcImage.clone(); for (int rows= 1;rows <dstImage.rows; rows++) { for (int cols = 1;cols < dstImage.cols - 1; cols++) { ****** uchar*data = dstImage.ptr<uchar>((rows)+cols); uchar*updata = dstImage.ptr<uchar>((rows - 1) + cols); uchar*downdata = dstImage.ptr<uchar>((rows + 1) + cols);****** 我这星号标记的这三行有什么问题啊?能否指点啊,我还有个程序找三叉点也有问题,能否指点啊;求大神啊

opencv下笛卡尔坐标图片转化为极坐标图片无法显示彩色图片

uchar interpolate_bilinear(cv::Mat& mat_src, double ri, int rf, int rc, double ti, int tf, int tc) { double inter_value = 0.0; if (rf == rc && tc == tf) { inter_value = mat_src.ptr<uchar>(rc)[tc]; } else if (rf == rc) { inter_value = (ti - tf) * mat_src.ptr<uchar>(rf)[tc] + (tc - ti) * mat_src.ptr<uchar>(rf)[tf]; } else if (tf == tc) { inter_value = (ri - rf) * mat_src.ptr<uchar>(rc)[tf] + (rc - ri) * mat_src.ptr<uchar>(rf)[tf]; } else { double inter_r1 = (ti - tf) * mat_src.ptr<uchar>(rf)[tc] + (tc - ti) * mat_src.ptr<uchar>(rf)[tf]; double inter_r2 = (ti - tf) * mat_src.ptr<uchar>(rc)[tc] + (tc - ti) * mat_src.ptr<uchar>(rc)[tf]; inter_value = (ri - rf) * inter_r2 + (rc - ri) * inter_r1; } return (uchar)inter_value; } bool cartesian_to_polar(cv::Mat& mat_c, cv::Mat& mat_p, int img_d) { int color_num = mat_c.channels(); cout << "color_num=" << color_num << endl; mat_p = cv::Mat::zeros(img_d, img_d, CV_8UC1); //mat_p = cv::Mat::zeros(img_d, img_d, CV_8UC3); //mat_p = cv::Mat::zeros(img_d, img_d, color_num); int line_len = mat_c.rows; int line_num = mat_c.cols; double delta_r = (2.0*line_len) / (img_d - 1); //半径因子 double delta_t = 2.0 * PI / line_num; //角度因子 double center_x = (img_d - 1) / 2.0; double center_y = (img_d - 1) / 2.0; for (int i = 0; i < img_d; i++) { for (int j = 0; j < img_d; j++) { double rx = j - center_x; //图像坐标转世界坐标 double ry = center_y - i; //图像坐标转世界坐标 double r = std::sqrt(rx*rx + ry*ry); if (r <= (img_d - 1) / 2.0) { double ri = r * delta_r; int rf = (int)std::floor(ri); int rc = (int)std::ceil(ri); if (rf < 0) { rf = 0; } if (rc >(line_len - 1)) { rc = line_len - 1; } double t = std::atan2(ry, rx); if (t < 0) { t = t + 2.0 * PI; } double ti = t / delta_t; int tf = (int)std::floor(ti); int tc = (int)std::ceil(ti); if (tf < 0) { tf = 0; } if (tc >(line_num - 1)) { tc = line_num - 1; } mat_p.ptr<uchar>(i)[j] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); /* mat_p.ptr<Vec3b>(i, j)[0] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); mat_p.ptr<Vec3b>(i, j)[1] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); mat_p.ptr<Vec3b>(i, j)[2] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); */ } } } return true; }

opencv使用MAT类型对像素进行处理的时候,会出现一个中断,烦人!!!

![图片说明](https://img-ask.csdn.net/upload/201711/29/1511935017_868535.png) 就是会跳到release的u=NULL这里就执行不下去了,这也不是我写的东西,怎么会出错呢?

OpenCV函数返回的简单问题

下面是一个OpenCV的小程序: ``` #include <opencv2/opencv.hpp> using namespace cv; using namespace std; template<typename _Tp> vector<_Tp> convertMat2Vector(const Mat &_t1f) { //_t1f.convertTo(t1f, CV_64F); return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行 } template<typename _Tp> cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows) { cv::Mat mat = cv::Mat(v);//将vector变成一列的mat cv::Mat dest=mat.reshape(cn, rows); cout << "dest=\n" << dest << endl; return dest; } int main() { int arr[4][3] = { { 1, 1,1 },{ 2, 2,2 },{ 3, 3,3 },{ 4,4, 4 } }; cv::Mat srcData(4, 3, CV_8UC1, arr); cout << "srcData=\n"<< srcData<< endl; vector<uchar> v = convertMat2Vector<uchar>(srcData); cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀? cout << "dest=\n" << dest << endl; system("pause"); waitKey(); return 0; } ``` 运行结果: ![图片说明](https://img-ask.csdn.net/upload/201805/09/1525835984_339212.png) 问题是:各位大神啊,我这哪里出问题?为什么函数里的dest和还回的dest的结果值为什么不一样的呀?

关于c++的opencv里vector<vector<Mat>>里对Mat赋值的问题

主函数里声明一个变量 ``` vector<vector<cv::Mat>> map(bottom[0]->num(), vector<cv::Mat>(bottom[0]->channels(), cv::Mat(bottom[0]->height(), bottom[0]->width(), CV_32S, cv::Scalar(0)))); BlobToMat(*bottom[0], map); template <typename Dtype> void BlobToMat(const Blob<Dtype>& blob, vector<vector<cv::Mat>>& map) { CHECK_EQ(blob.num(),1)<<"Phase:TEST, batch_size should be 1."; const int batch_size = blob.num(); const int channel = blob.channels(); const int height = blob.height(); const int width = blob.width(); for(int i=0; i<batch_size; ++i) for(int j=0; j<channel; ++j) for(int m=0; m<height; ++m) for(int n=0; n<width; ++n) { map[i][j].at<int>(m,n) = (int)(blob.cpu_data()[((i*channel+j)*height+m)*width+n]); } for(int i=0; i<batch_size; ++i) for(int j=0; j<channel; ++j) { cv::imshow("test", map[i][j]*255*255); cv::waitKey(0); } } ``` 之后的结果与预期不符,channel循环的时候,第i个Mat的值会变成第i+1个Mat的值?很奇怪?正确方法该如何使用呢? 我得到的结果如图: ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359773_763374.jpg) ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359787_40538.jpg) ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359793_214817.jpg) 所有图像都变成一样的了,即最后一个Mat的图像,这个问题困惑我很久了,这是为什么呢?

OpenCV中對vector<Mat>添加return返還

如題,小弟最近在做有關opencv的程式,是關於找出鏡頭畫面之藍色區域並且計算邊長與旋轉角度,由於有時跳出 vector subscript out of range 這段程式碼,後來發現是因為如果攝像機沒有出現目標設定之藍色區域,此時vector會超出他的範圍,如果我想添加一段判斷式在vector<Mat> channels; 這邊,判斷當vector範圍超出時返還,則該判別式 該如何寫? 小弟試過幾次結果並不成功,還請各位前輩指教一下,以下放是片段程式碼 int main() { VideoCapture cap(0); if (!cap.isOpened()) { cout << " Camera Has Been Opened !" << endl; return -1; } Mat frame; while (1) //儲存WebCam上面之畫面 { cap >> frame; imwrite("C:/Navigation/WebCam_Image.jpg", frame); if (frame.empty()) { cout << " Error Writing the Image !" << endl; return -4; } line(frame, Point(0, 240), Point(640, 240), Scalar(0, 255, 0), 1, CV_AA); line(frame, Point(320, 0), Point(320, 480), Scalar(0, 255, 0), 1, CV_AA); imshow("WebCam", frame); if (waitKey(1) == 27) { break; } } //Blue //留住 Mat srcImg, midImg, dstImg; srcImg = imread("C:/Navigation/WebCam_Image.jpg"); //C:/Lock Mouse/WebCam_Image.jpg //C:/Navigation/5.png Mat xianshi = srcImg.clone(); Mat redChannel, greenChannel, blueChannel; //namedWindow("【Original】", WINDOW_AUTOSIZE); //imshow("【Original】", srcImg); //0.灰階 Mat grayImg; vector<Mat> channels; split(srcImg, channels); //cvtColor(srcImg,grayImg,COLOR_BGR2GRAY); grayImg = channels.at(0); //對藍色區域取灰階圖 redChannel = channels.at(2); greenChannel = channels.at(1); blueChannel = channels.at(0); //namedWindow("【Blue 灰度圖】", WINDOW_AUTOSIZE); //imshow("【Blue 灰度圖】", grayImg); //1.均值濾波 blur(grayImg, grayImg, Size(20, 20), Point(-1, -1)); //namedWindow("【均值濾波後】", WINDOW_NORMAL); //imshow("【均值濾波後】", grayImg); //2.轉化為二值圖 Mat midImg1 = grayImg.clone(); int rowNumber = midImg1.rows; int colNumber = midImg1.cols; for (int i = 0; i < rowNumber; i++) //僅限定天藍色區域 { uchar* data = midImg1.ptr<uchar>(i); //取第i行的首地址 uchar* redData = redChannel.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { if (data[j] > BIN_DIV&&redData[j] < BIN_DIV * 2 / 3) data[j] = 255; else data[j] = 0; } } namedWindow("【Blue 二值圖】", WINDOW_AUTOSIZE); imshow("【Blue 二值圖】", midImg1); Mat midImg2 = midImg1.clone(); Mat element = getStructuringElement(MORPH_RECT, Size(50, 50)); morphologyEx(midImg1, midImg2, MORPH_CLOSE, element); namedWindow("【Blue 開運算後】", WINDOW_AUTOSIZE); imshow("【Blue 開運算後】", midImg2); //cout << "midImg1.channel=" << midImg1.channels() << endl; //cout << "mdiImg1.depth" << midImg1.depth() << endl; //3.查找圖像輪廓 Mat midImg3 = Mat::zeros(midImg2.rows, midImg2.cols, CV_8UC3); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(midImg2, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); for (int index = 0; index >= 0; index = hierarchy[index][0]) { Scalar color(255, 255, 255); drawContours(midImg3, contours, index, color, NULL, 8, hierarchy); } //namedWindow("【輪廓圖】", WINDOW_NORMAL); //imshow("【輪廓圖】", midImg3); Mat midImg4 = midImg3.clone(); //4.創建包圍輪廓的矩形邊界 int cnt = 0; for (int i = 0; i < contours.size(); i++) { //float length, length2, midx, midy, midx2, midy2; static int length, length2, midx, midy, midx2, midy2; float ang, m, pixel_area, pixel_length, pixel_length2, dis; //每個輪廓 vector<Point> points = contours[i]; //對給定的2D點集,尋找最小面積的包圍矩形 RotatedRect box = minAreaRect(Mat(points)); Point2f vertex[4]; box.points(vertex); //繪製出最小面積的包圍矩形 line(xianshi, vertex[0], vertex[1], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[1], vertex[2], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[2], vertex[3], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[3], vertex[0], Scalar(100, 200, 211), 2, CV_AA); //cout << " [" << i << "] (" << vertex[i].x << "," << vertex[i].y << ")" << endl; //印出座標 //總共 i 個圖形,共 4 * i 個交點 if (i == 0) { for (int i = 0; i < 4; i++) { circle(xianshi, Point(vertex[i].x, vertex[i].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4 * i 個交點儲存 vertexx[i] = vertex[i].x; vertexy[i] = vertex[i].y; } } else { for (int j = 0; j < 4; j++) { circle(xianshi, Point(vertex[j].x, vertex[j].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4*i 個交點儲存 vertexx[j + (i * 4)] = vertex[j].x; vertexy[j + (i * 4)] = vertex[j].y; } } //計算長度 pixel_length = sqrt((vertex[0].x - vertex[1].x)*(vertex[0].x - vertex[1].x) + (vertex[0].y - vertex[1].y)*(vertex[0].y - vertex[1].y)); midx = abs((vertex[0].x - vertex[1].x) / 2) + vertex[1].x; midy = abs((vertex[0].y - vertex[1].y) / 2) + vertex[1].y; pixel_length2 = sqrt((vertex[1].x - vertex[2].x)*(vertex[1].x - vertex[2].x) + (vertex[1].y - vertex[2].y)*(vertex[1].y - vertex[2].y)); //3.625 midx2 = abs((vertex[1].x - vertex[2].x) / 2) + vertex[1].x; midy2 = abs((vertex[1].y - vertex[2].y) / 2) + vertex[2].y; //Area pixel_area = pixel_length * pixel_length2; //cout << " Pixel_Length = " << pixel_length << " , Pixel_Length2 = " << pixel_length2 << endl; //cout << (" Pixel_Area ") << i << (" = ") << pixel_area << endl; mag = (pixel_length + pixel_length2) / (2 * 31); length = pixel_length / mag; length2 = pixel_length2 / mag; sprintf_s(text, "%dmm", length); putText(xianshi, text, Point(midx, midy), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx, midy), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** sprintf_s(text, "%dmm", length2); putText(xianshi, text, Point(midx2, midy2), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx2, midy2), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** //Angle m = (vertex[0].y - vertex[1].y) / (vertex[0].x - vertex[1].x); ang = atan(m)*(180 / pi); //cout << ("m = ") << m << endl; cout << (" Angle ") << i << (" = ") << 90 - ang << endl; //Distance dis = (6.15 * 110) / mag; cout << " Distance = " << dis << " mm" << endl; //mark sprintf_s(text, "%d", i); putText(xianshi, text, Point(midx + 50, midy + 50), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** //繪製中心的光標 Point s1, l, r, u, d; s1.x = (vertex[0].x + vertex[2].x) / 2.0; s1.y = (vertex[0].y + vertex[2].y) / 2.0; l.x = s1.x - 10; l.y = s1.y; r.x = s1.x + 10; r.y = s1.y; u.x = s1.x; u.y = s1.y - 10; d.x = s1.x; d.y = s1.y + 10; line(xianshi, l, r, Scalar(255, 255, 255), 1, CV_AA); //水平 capx = r.x - 10; navx[i] = capx; line(xianshi, u, d, Scalar(255, 255, 255), 1, CV_AA); //垂直 capy = d.y - 10; navy[i] = capy; cout << (" Object Number = ") << i << (", Mid x = ") << capx << (", Mid y = ") << capy << endl; cout << endl; } for (int i = 0; i < contours.size(); i++) { navx[25]; navy[25]; //cout << ("i = ") << i << (", navx = ") << navx[i] << (", navy = ") << navy[i] << endl; }

【OpenCV】Mat类遍历像素 为什么不能 从图像下面到上面呢?

从上至下编译成功,但从下至上失败,为什么? 下面的循环代码需要怎么更改? //遍历灰度值 uchar* p; for (int i = rows; i >1; i--) { p = image.ptr<uchar>(i); //获取像素指针 for (int j = 0; j < cols - 4; j++) { //对满足一定条件的像素赋值 } }

cv::filestorage读写yml失败问题

跑opencv2.4.10或opencv2.4.9或opencv2.4.11中例程opencv\samples\cpp\tutorial_code\core\file_input_output\file_input_output.cpp int main(int ac, char** av) { if (ac != 2) { help(av); return 1; } string filename = av[1]; { //write Mat R = Mat_<uchar>::eye(3, 3), T = Mat_<double>::zeros(3, 1); MyData m(1); FileStorage fs(filename, FileStorage::WRITE); fs << "iterationNr" << 100; .......... } 代码中 FileStorage fs(filename, FileStorage::WRITE);话没有返回正确fs,调试的时候说fs是错误的指针,变量filename在命令参数中给出,已被正确赋值为q.yml,但没有产生q.yml。用fs.isopened检查文件状态返回0.该怎么正确读写yml文件 我的环境是windows10+vs2010+opencv2.4.10/opencv2.4.11/opencv/2.4.9.感觉我的电脑不能正常使用cv::filestorage这个类。cvfilestorage结构体可以正常读取 yml文件

关于opencv在Python中的实现

void on_mouse( int event, int x, int y, int flags, void* ustc) { static CvPoint pre_pt = {-1,-1}; static CvPoint cur_pt = {-1,-1}; CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); char temp[16]; 这一段代码如果用Python来写要怎么改?

Opencv中写入数据到内存

如何把Mat 类型的数据,压缩成jpeg并写入内存,比如说某个uchar数组.我知道用imwrite,可以实现 把Mat类型数据压缩成jpeg并写入文件.有没有哪位大神知道,将结果写入内存而不是文件?

opencv3.0.0出现无法解析的外部命令

opencv3.0.0出现无法解析的外部命令 头文件代码: #if !defined COLORDETECT #define COLORDETECT #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> class ColorDetector { private: // minimum acceptable distance int maxDist; // target color cv::Vec3b target; // image containing color converted image cv::Mat converted; bool useLab; // image containing resulting binary map cv::Mat result; public: // empty constructor // default parameter initialization here ColorDetector() : maxDist(100), target(0, 0, 0), useLab(false) {} // extra constructor for Lab color space example ColorDetector(bool useLab) : maxDist(100), target(0, 0, 0), useLab(useLab) {} // full constructor ColorDetector(uchar blue, uchar green, uchar red, int mxDist = 100, bool useLab = false) : maxDist(mxDist), useLab(useLab) { // target color setTargetColor(blue, green, red); } // Computes the distance from target color. int getDistanceToTargetColor(const cv::Vec3b& color) const { return getColorDistance(color, target); } // Computes the city-block distance between two colors. int getColorDistance(const cv::Vec3b& color1, const cv::Vec3b& color2) const { return abs(color1[0] - color2[0]) + abs(color1[1] - color2[1]) + abs(color1[2] - color2[2]); // Or: // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-color2[0],color[1]-color2[1],color[2]-color2[2]))); // Or: // cv::Vec3b dist; // cv::absdiff(color,color2,dist); // return cv::sum(dist)[0]; } // Processes the image. Returns a 1-channel binary image. cv::Mat process(const cv::Mat &image); cv::Mat operator()(const cv::Mat &image) { cv::Mat input; input = image; if (useLab) { // Lab conversion cv::cvtColor(image, input, CV_BGR2Lab); } cv::Mat output; // compute absolute difference with target color cv::absdiff(input, cv::Scalar(target), output); // split the channels into 3 images std::vector<cv::Mat> images; cv::split(output, images); // add the 3 channels (saturation might occurs here) output = images[0] + images[1] + images[2]; // apply threshold cv::threshold(output, // input image output, // output image maxDist, // threshold (must be < 256) 255, // max value cv::THRESH_BINARY_INV); // thresholding type return output; } // Getters and setters // Sets the color distance threshold. // Threshold must be positive, otherwise distance threshold // is set to 0. void setColorDistanceThreshold(int distance) { if (distance < 0) distance = 0; maxDist = distance; } // Gets the color distance threshold int getColorDistanceThreshold() const { return maxDist; } // Sets the color to be detected void setTargetColor(uchar blue, uchar green, uchar red) { // BGR order target = cv::Vec3b(blue, green, red); if (useLab) { // Temporary 1-pixel image cv::Mat tmp(1, 1, CV_8UC3); tmp.at<cv::Vec3b>(0, 0) = cv::Vec3b(blue, green, red); // Converting the target to Lab color space cv::cvtColor(tmp, tmp, CV_BGR2Lab); target = tmp.at<cv::Vec3b>(0, 0); } } // Sets the color to be detected void setTargetColor(cv::Vec3b color) { target = color; } // Gets the color to be detected cv::Vec3b getTargetColor() const { return target; } }; #endif 主函数代码: #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/core/core.hpp> #include"colordetector.h" int main() { // 1. Create image processor object ColorDetector cdetect; // 2. Read input image cv::Mat image = cv::imread("Schluss.jpg"); if (image.empty()) return 0; // 3. Set input parameters cdetect.setTargetColor(250, 219, 133); // here blue sky // 4. Process the image and display the result cv::namedWindow("result"); cv::imshow("result", cdetect.process(image)); // or using functor ColorDetector colordetector(250, 219, 133, // color 45, true); // Lab threshold cv::namedWindow("result (functor)"); cv::imshow("result (functor)", colordetector(image)); cv::waitKey(); return 0; } 依赖的库添加了: D:\opencv\build\x64\vc12\lib\opencv_ts300.lib D:\opencv\build\x64\vc12\lib\opencv_world300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgproc300.lib D:\opencv\build\x64\vc12\staticlib\IlmImf.lib D:\opencv\build\x64\vc12\staticlib\ippicvmt.lib D:\opencv\build\x64\vc12\staticlib\libjpeg.lib D:\opencv\build\x64\vc12\staticlib\libpng.lib D:\opencv\build\x64\vc12\staticlib\libtiff.lib D:\opencv\build\x64\vc12\staticlib\libwebp.lib D:\opencv\build\x64\vc12\staticlib\opencv_calib3d300.lib D:\opencv\build\x64\vc12\staticlib\opencv_core300.lib D:\opencv\build\x64\vc12\staticlib\opencv_features2d300.lib D:\opencv\build\x64\vc12\staticlib\opencv_flann300.lib D:\opencv\build\x64\vc12\staticlib\opencv_hal300.lib D:\opencv\build\x64\vc12\staticlib\opencv_highgui300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgcodecs300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgproc300.lib D:\opencv\build\x64\vc12\staticlib\opencv_ml300.lib D:\opencv\build\x64\vc12\staticlib\opencv_objdetect300.lib D:\opencv\build\x64\vc12\staticlib\opencv_photo300.lib D:\opencv\build\x64\vc12\staticlib\opencv_shape300.lib D:\opencv\build\x64\vc12\staticlib\opencv_stitching300.lib D:\opencv\build\x64\vc12\staticlib\opencv_superres300.lib D:\opencv\build\x64\vc12\staticlib\opencv_video300.lib D:\opencv\build\x64\vc12\staticlib\opencv_videoio300.lib D:\opencv\build\x64\vc12\staticlib\opencv_videostab300.lib D:\opencv\build\x64\vc12\staticlib\zlib.lib 解决方案配置是Release x64 刚开始学OpenCV,请各位大佬帮帮我

opencv+cuda关于GpuMat数据转递问题

萌新刚刚接触opencv+cuda不久,还不是很熟练,现在碰到了一个问题,不知道有没有大佬知道解决方法 实际问题中我想定义一个GpuMat类型的数组,例如cv::cuda::GpuMat cu_proj[10][128]; 然后传递给核函数的时候就显示如下错误 error : no suitable constructor exists to convert from "cv::cuda::GpuMat [10][128]" to "cv::cuda::PtrStepSz<uchar1>" 我网上搜到的都是单个GpuMat的传递,不知道我这种情况有没有解决方法呀?以及如果有,在核函数中应该怎么索引呢?我试过cu_proj[x][y](i, y),也显示错误: error : no operator "[]" matches these operands 感激不尽!

opencv imshow()崩溃 急求救

平台win 7 64位 vs2013 opencv3.0.0 debug和release x64的模式下都不行 #include<iostream> #include<opencv2/opencv.hpp> using namespace cv; using namespace std; int main(){ Mat grayim(600, 800, CV_8UC1); for (int i = 0; i < grayim.rows; i++) for (int j = 0; j < grayim.cols; j++) grayim.at<uchar>(i, j) = (i, j) % 255; imshow("grayim", grayim); waitKey(0); return 0; } 像这段,运行到imshow()就会中断……快崩溃了 ,网上百度的方法都试过了,还是没解决 调试报错信息: 0x00000000776FF922 (ntdll.dll) (openCV_test1.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x0000000077776470)。

opencv 操作像素报错 cv::Exception

我在网上看到了很多种方法去操作图中的像素,但是无论用哪个都出现这样的错误: 0x7611b727 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0039fa94 处的 cv::Exception。 编译是正确的。 我的代码: #include <iostream> #include <string> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> int main(int argc, char** argv) { //int i = 0; cv::Mat foreground; //for(int i = 0; i < 320; i++){ // for(int j = 0; j < 240; j++){ // foreground.at<cv::Vec3b>(i,j)[0] = 0; // foreground.at<cv::Vec3b>(i,j)[1] = 0; // foreground.at<cv::Vec3b>(i,j)[2] = 0; // foreground.at<uchar>(i,j) = 0; // } //} for (int j=0; j<foreground.rows; j++) { uchar* data= foreground.ptr<uchar>(j); for (int i=0; i<foreground.cols; i++) { data[i] = 255; } } //for(int i=0;i<foreground.rows;i++) // for(int j=0;j<foreground.cols;j++) // foreground.at<uchar>(i,j)=255; cv::imshow("video", foreground); return 0; } 里面种种被注释的也就是网上提到的一些方法。问题到底出在哪里了?没初始化么?可是我现在没注释掉的,就是逐像素赋值啊?我做的是运动目标跟踪,本来是在提取出运动区域以后(一张二值化的图)想根据运动区域的轮廓取出目标来,然后可以算直方图、角点什么的。在整体的代码里面,foreground是已经计算除的前景,所以也是有图像的,一样报错。 另外有哪位大神愿意被骚扰以后碰到问题直接问?求助啊

opencv图像处理锐化问题

使用sharpen函数锐化灰度图像,但是只是锐化了三分之一,这个是教程的代码,看不出来哪里错了,求大佬们指导下。 代码如下: #include<opencv2/core/core.hpp>//opencv2的核心头文件 #include<opencv2/highgui/highgui.hpp>//包括图形界面和视频图像处理的头文件 #include<iostream>//每个c++程序必须包含的头文件 #include<opencv2/imgproc/imgproc.hpp> void sharpen(const cv::Mat &image, cv::Mat &result) { result.create(image.size(), image.type()); // allocate if necessary for (int j = 1; j<image.rows - 1; j++) { // for all rows (except first and last) const uchar* previous = image.ptr<const uchar>(j - 1); // previous row const uchar* current = image.ptr<const uchar>(j); // current row const uchar* next = image.ptr<const uchar>(j + 1); // next row uchar* output = result.ptr<uchar>(j); // output row for (int i = 1; i<image.cols - 1; i++) { *output++ = cv::saturate_cast<uchar>(5 * current[i] - current[i - 1] - current[i + 1] - previous[i] - next[i]); // output[i]= cv::saturate_cast<uchar>(5*current[i]-current[i-1]-current[i+1]-previous[i]-next[i]); } } // Set the unprocess pixels to 0 result.row(0).setTo(cv::Scalar(0)); result.row(result.rows - 1).setTo(cv::Scalar(0)); result.col(0).setTo(cv::Scalar(0)); result.col(result.cols - 1).setTo(cv::Scalar(0)); } int main() { cv::Mat result; cv::Mat image; image = cv::imread("8.jpg"); sharpen(image,result ); cv::namedWindow("image"); cv::imshow("image", image); cv::namedWindow("result"); cv::imshow("result", result); cvWaitKey(0); return 0; }

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐