日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ opencv的一些基础知识

發(fā)布時(shí)間:2024/7/23 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ opencv的一些基础知识 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.基礎(chǔ)知識?

1.cv::mat type返回?cái)?shù)字對應(yīng)的類型

?C1, C2, C3, C4 指的是通道(Channel)數(shù),比如3通道的float 32:

cv::Mat M5 = cv::Mat::zeros(2, 3, CV_32FC(3));

2.at方法數(shù)據(jù)類型

知道通道數(shù)和每個(gè)通道數(shù)據(jù)類型的情況下,指定給?at?方法的數(shù)據(jù)類型如下表所示:

#include<opencv2/opencv.hpp> #include<iostream> #include<string> using namespace std;void debug_opencv(){cv::Mat M1 = cv::Mat::zeros(2, 3, CV_32F);//CV_32F等效于CV_32FC(1)cout<<"M1.type():"<<M1.type()<<endl;cout<<"M1:"<<M1<<endl;cv::Mat M2 = cv::Mat::zeros(2, 3, CV_32FC(1));cout<<"before M2.type()"<<M2.type()<<endl;cout<<"before M2:"<<M2<<endl;for(int i = 0; i < M2.rows; i++){for(int j = 0; j < M2.cols; j++){for(int c = 0; c < M2.channels(); c++){M2.at<cv::Vec<float, 1>>(i, j)[c] = float(i + j + c);}}}cout<<"after M2.type()"<<M2.type()<<endl;cout<<"after M2"<<M2<<endl;//Vec2f表示的是2通道float類型的cv::Mat M3 = cv::Mat::zeros(2, 3, CV_32FC(2));cout<<"before M3.type()"<<M3.type()<<endl;cout<<"before M3:"<<M3<<endl;for(int i = 0; i < M3.rows; i++){for(int j = 0; j < M3.cols; j++){for(int c = 0; c < M3.channels(); c++){ // if(c == 0){ // cout<<"float(i + j + c):"<<float(i + j + c)<<","; // }M3.at<cv::Vec2f>(i, j)[c] = float(i + j + c);}}}cout<<"after M3.type()"<<M3.type()<<endl;cout<<"after M3:"<<M3<<endl;//[0, 1, 1, 2, 2, 3;// 1, 2, 2, 3, 3, 4]//Vec3f表示的是3通道float類型的cv::Mat M5 = cv::Mat::zeros(2, 3, CV_32FC(3));cout<<"before M5.type()"<<M5.type()<<endl;cout<<"before M5:"<<M5<<endl;for(int i = 0; i < M5.rows; i++){for(int j = 0; j < M5.cols; j++){for(int c = 0; c < M5.channels(); c++){ // if(c == 0){ // cout<<"float(i + j + c):"<<float(i + j + c)<<","; // }M5.at<cv::Vec3f>(i, j)[c] = float(i + j + c);}}}cout<<"M5:"<<M5<<endl;//[0, 1, 2, 1, 2, 3, 2, 3, 4;//1, 2, 3, 2, 3, 4, 3, 4, 5] } int main(){ debug_opencv();return 0; }

?

3.mat賦值

cv::Mat trans_mat(2, 3, CV_32FC(1), cv::Scalar(1));cout<<"==trans_mat.size:"<<trans_mat.size<<endl;cout<<"==trans_mat:"<<trans_mat<<endl;cv::Mat affine_matrix =(cv::Mat_<float>(3, 3) << trans_mat.at<float>(0), trans_mat.at<float>(1), trans_mat.at<float>(2),trans_mat.at<float>(3), trans_mat.at<float>(4), trans_mat.at<float>(5), 0, 0, 1); cout<<"==affine_matrix:"<<affine_matrix<<endl;

二.一些api

1.構(gòu)建矩陣

#include "iostream" #include <opencv2/opencv.hpp> #include "opencv2/dnn/dnn.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp" #include <vector> using namespace std;typedef cv::Vec<double, 5> Vec5d;void scalar_demo4(){cv::Mat M = cv::Mat::zeros(2, 3, CV_64FC(5));cout<<"==M.channels():"<<M.channels()<<endl;cout<<"==before M:"<<M<<endl;for(int i = 0; i < M.rows; i++){for(int j = 0; j < M.cols; j++){for(int c = 0; c < M.channels(); c++){M.at<Vec5d>(i,j)[c] = c * 0.01;}}}cout<<"==after M:"<<M<<endl; }int main(int argc ,char** argv) {cout<<CV_VERSION<<endl;scalar_demo4();return 0; }

2.構(gòu)建矩陣與訪問某個(gè)像素值

#include "iostream" #include <opencv2/opencv.hpp> #include "opencv2/dnn/dnn.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp" #include <vector> using namespace std;cv::Mat scalar_demo1(){cv::Mat M(4,4,CV_32FC2,cv::Scalar(1,3));cout<<"before M"<<M<<endl;return M; } void scalar_demo2(){cv::Mat M(4,4,CV_32FC3,cv::Scalar(1,2,3));cout<<M<<endl;cout<<"==M.type():"<<M.type()<<endl;cout<<"==M.channels():"<<M.channels()<<endl;cout<<"==M.rows:"<<M.rows<<endl;cout<<"==M.cols:"<<M.cols<<endl;//獲取矩陣size 只顯示h w 不顯示channelcv::Size size_ = M.size();cout<<"==size_:"<<size_<<endl;//獲取面積int area = M.total();cout<<"==area:"<<area<<endl;//獲取維數(shù)int dims = M.dims;cout<<"==dims:"<<dims<<endl;//訪問某個(gè)值 利用成員函數(shù)at 先獲取坐標(biāo)處向量 再根據(jù)索引獲取值cv::Vec3f pixel_vector1 = M.at<cv::Vec3f>(0, 0);//獲取y=0 x=0處向量cout<<"==pixel_vector1:"<<pixel_vector1<<endl;cout<<"==pixel_vector1[1]:"<<pixel_vector1[1]<<endl;//訪問某個(gè)值 利用成員函數(shù)ptrauto* ptr1 = M.ptr<cv::Vec3f>(0);//獲取y=0處地址cv::Vec3f pixel_vector2 = ptr1[0];// 再來x=0處獲取向量cout<<"==ptr1:"<<ptr1<<endl;cout<<"==*ptr1:"<<*ptr1<<endl;//得到首地址向量cout<<"==pixel_vector2:"<<pixel_vector2<<endl;cout<<"==pixel_vector2[1]:"<<pixel_vector2[1]<<endl;//訪問某個(gè)值用: 利用成員變量data和step, step[0]表示每一行占的字節(jié),step[1]表示每個(gè)元素占的字節(jié)int y = 0, x = 0;auto* ptr2 = (cv::Vec3f* )(M.data + y * M.step[0] + x * M.step[1]);//獲取y=0 x=0處向量地址cout<<"==ptr2:"<<ptr2<<endl;cout<<"==*ptr2:"<<*ptr2<<endl; //得到首地址向量cv::Vec3f pixel_vector3 = ptr2[0];cout<<"==pixel_vector3:"<<pixel_vector2<<endl;cout<<"==pixel_vector2[1]:"<<pixel_vector2[1]<<endl; } void scalar_demo3(){cv::Mat M(4,4,CV_32FC4,cv::Scalar(1,2,3));cout<<M<<endl;cout<<"==M.type():"<<M.type()<<endl; }int main(int argc ,char** argv) {cout<<CV_VERSION<<endl;cv::Mat M = scalar_demo1();cout<<"after M"<<M<<endl;cout<<"**********************************"<<endl;scalar_demo2();cout<<"**********************************"<<endl;scalar_demo3();return 0; }

?CV_32F表示每個(gè)元素的值的類型為32位浮點(diǎn)數(shù),C2表示通道數(shù)為2,Scalar(1,2,3)表示對矩陣每個(gè)元素都賦值為(1,2,3),第一個(gè)通道中的值都是1,第二個(gè)通道中的值都是2,第三個(gè)通道中的值都是3.

3.split與merge

#include "iostream" #include <opencv2/opencv.hpp> #include "opencv2/dnn/dnn.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp" #include <vector> using namespace std;typedef cv::Vec<double, 5> Vec5d;void scalar_demo4(){cv::Mat M = cv::Mat::zeros(2, 3, CV_64FC(5));cout<<"==M.channels():"<<M.channels()<<endl;cout<<"==before M:"<<M<<endl;for(int i = 0; i < M.rows; i++){for(int j = 0; j < M.cols; j++){for(int c = 0; c < M.channels(); c++){M.at<Vec5d>(i,j)[c] = c * 0.01;}}}cout<<"==after M:"<<M<<endl;//split 拆分通道vector<cv::Mat> channels;cv::split(M, channels);cout<<"==channels[0]:"<<channels[0]<<endl;cout<<"==channels[1]:"<<channels[1]<<endl;cout<<"==channels[2]:"<<channels[2]<<endl;cout<<"==channels[3]:"<<channels[3]<<endl;cout<<"==channels[4]:"<<channels[4]<<endl;//Merge合并cv::Mat newchannels[] = {channels[4], channels[3], channels[2], channels[1], channels[0]};cv::Mat MergeM;cv::merge(newchannels, sizeof(newchannels)/ sizeof(newchannels[0]), MergeM);cout<<"==merge M:"<<MergeM<<endl; }int main(int argc ,char** argv) {cout<<CV_VERSION<<endl;scalar_demo4();return 0; }

4.查看視頻幀與統(tǒng)計(jì)時(shí)間

python:

#!/usr/bin/env pythonimport cv2 import timeif __name__ == '__main__' :# Start default cameravideo = cv2.VideoCapture(0);# Find OpenCV version(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')print(major_ver, minor_ver, subminor_ver)# With webcam get(CV_CAP_PROP_FPS) does not work.# Let's see for ourselves.if int(major_ver) < 3 :fps = video.get(cv2.cv.CV_CAP_PROP_FPS)print("Frames per second using video.get(cv2.cv.CV_CAP_PROP_FPS): {0}".format(fps))else :fps = video.get(cv2.CAP_PROP_FPS)print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))# Number of frames to capturenum_frames = 120print("Capturing {0} frames".format(num_frames))# Start timestart = time.time()# Grab a few framesfor i in range(0, num_frames):ret, frame = video.read()# End timeend = time.time()# Time elapsedseconds = end - startprint("Time taken : {0} seconds".format(seconds))# Calculate frames per secondfps = num_frames / secondsprint("Estimated frames per second : {0}".format(fps))# Release videovideo.release()

c++:

#include <opencv2/opencv.hpp> #include "time.h" int main(){// Start default cameracv::VideoCapture video(0);// With webcam get(CV_CAP_PROP_FPS) does not work.// Let's see for ourselves.std::cout << CV_VERSION<<std::endl;double fps = video.get(cv::CAP_PROP_FPS);// If you do not care about backward compatibility// You can use the following instead for OpenCV 3// double fps = video.get(CAP_PROP_FPS);std::cout << "Frames per second using video.get(CV_CAP_PROP_FPS) : " << fps << std::endl;int num_frames = 120;// Start and end timestime_t start, end;// Variable for storing video framescv::Mat frame;std::cout << "Capturing " << num_frames << " frames" << std::endl ;// Start timetime(&start);// Grab a few framesfor(int i = 0; i < num_frames; i++){video >> frame;}// End Timetime(&end);// Time elapseddouble seconds = difftime (end, start);std::cout << "Time taken : " << seconds << " seconds" << std::endl;// Calculate frames per secondfps = num_frames / seconds;std::cout << "Estimated frames per second : " << fps << std::endl;// Release videovideo.release();return 0; }

5.仿射變換

// // Created by fzh on 2021/6/22. ////#include <pybind11/numpy.h> //#include <a.h> //#include <b.h> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <string> #include <algorithm> #include <vector> #include <memory>typedef cv::Vec<double, 5> Vec5d; using namespace std;cv::Mat pre_process(const cv::Mat &image, std::vector<float> &ratio) {// normalize//debugint input_width_ = 800, input_height_ = 1333;cv::Scalar mean_ = cv::Scalar(111.522);cv::Scalar std_ = cv::Scalar(1./38.877);cv::Mat normed_image;float img_height = image.rows;float img_width = image.cols;float max_long_edge = std::max(input_width_, input_height_);float max_short_edge = std::min(input_width_, input_height_);float scale_factor =std::min(max_long_edge / std::max(img_height, img_width),max_short_edge / std::min(img_height, img_width));// int new_h = scale_factor * img_height;// int new_w = scale_factor * img_width;ratio.push_back(scale_factor);ratio.push_back(scale_factor);cv::Mat transform_mat =(cv::Mat_<float>(2, 3) << scale_factor, 0, 0, 0, scale_factor, 0);cout<<"transform_mat:"<<transform_mat<<endl;cv::Mat resized_img;cv::warpAffine(image, resized_img, transform_mat,cv::Size(input_width_, input_height_), cv::INTER_LINEAR,cv::BORDER_CONSTANT, cv::Scalar(127));// cv::resize(image, resized_img, cv::Size(input_width_, input_height_));// img.convertTo(normed_im, CV_32FC3, 1 / 255.0);cv::imwrite("warp_resize_img.jpg", resized_img);resized_img.convertTo(normed_image, CV_32FC1);// cv::Mat mean(input_height_, input_width_, CV_32FC3, s);normed_image -= mean_;normed_image = normed_image.mul(std_);return normed_image; } void debug_preprocess(){cv::Mat img = cv::imread("/2.jpg", 0);vector<float> ratio;std::cout<<"before img h:"<<img.rows<<std::endl;std::cout<<"before img w:"<<img.cols<<std::endl;pre_process(img, ratio);for(int i=0; i<ratio.size(); i++){cout<<"ratio[i]:"<<ratio[i]<<endl;} } int main(int argc, char** argv) {debug_preprocess();return 0; }

6.cv::minMaxLoc獲取feature map最大值索引

python代碼:

from __future__ import division import cv2 import time import numpy as npprotoFile = "./hand/pose_deploy.prototxt" weightsFile = "./hand/pose_iter_102000.caffemodel" nPoints = 22 POSE_PAIRS = [[0, 1], [1, 2], [2, 3], [3, 4],[0, 5], [5, 6], [6, 7], [7, 8],[0, 9], [9, 10], [10, 11], [11, 12],[0, 13], [13, 14], [14, 15], [15, 16],[0, 17], [17, 18], [18, 19], [19, 20]] net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)frame = cv2.imread("./right-frontal.jpg") frameCopy = np.copy(frame) frameWidth = frame.shape[1] frameHeight = frame.shape[0] aspect_ratio = frameWidth / frameHeightthreshold = 0.1start_time = time.time() # input image dimensions for the network inHeight = 368 inWidth = int(((aspect_ratio * inHeight) * 8) // 8) print(inHeight, inWidth) # frame = cv2.resize(frame, (inWidth, inHeight)) # print(frame.shape) inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)net.setInput(inpBlob) print(inpBlob.shape) output = net.forward() print("time taken by network : {:.3f}".format(time.time() - start_time))# Empty list to store the detected keypoints points = []for i in range(nPoints):# confidence map of corresponding body's part.probMap = output[0, i, :, :]probMap = cv2.resize(probMap, (frameWidth, frameHeight))# Find global maxima of the probMap.minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)if prob > threshold:cv2.circle(frameCopy, (int(point[0]), int(point[1])), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)cv2.putText(frameCopy, str(i), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,lineType=cv2.LINE_AA)# Add the point to the list if the probability is greater than the thresholdpoints.append((int(point[0]), int(point[1])))else:points.append(None)# Draw Skeleton for pair in POSE_PAIRS:partA = pair[0]partB = pair[1]if points[partA] and points[partB]:cv2.line(frame, points[partA], points[partB], (0, 255, 255), 2)cv2.circle(frame, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)cv2.circle(frame, points[partB], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)cv2.imshow('Output-Keypoints', frameCopy) cv2.imshow('Output-Skeleton', frame)cv2.imwrite('Output-Keypoints.jpg', frameCopy) cv2.imwrite('Output-Skeleton.jpg', frame)print("Total time taken : {:.3f}".format(time.time() - start_time))cv2.waitKey(0) cv::Mat probMap = (cv::Mat_<float>(3, 3) <<0,10,0,1,2,3,4,5,6);cv::Point maxLoc;double prob;cout<<"probMap:"<<probMap<<endl;cv::minMaxLoc(probMap, 0, &prob, 0, &maxLoc);cout<<"maxLoc.x:"<<maxLoc.x<<endl;cout<<"maxLoc.y"<<maxLoc.y<<endl;

c++代碼:

#include <opencv2/dnn.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <iostream>const int POSE_PAIRS[20][2] ={{0,1}, {1,2}, {2,3}, {3,4}, // thumb{0,5}, {5,6}, {6,7}, {7,8}, // index{0,9}, {9,10}, {10,11}, {11,12}, // middle{0,13}, {13,14}, {14,15}, {15,16}, // ring{0,17}, {17,18}, {18,19}, {19,20} // small};std::string protoFile = "/home/momenta/AI/c++_project_test/hand/pose_deploy.prototxt"; std::string weightsFile = "/home/momenta/AI/c++_project_test/hand/pose_iter_102000.caffemodel";int nPoints = 22;int main(int argc, char **argv) {std::cout << "USAGE : ./handPoseImage <imageFile> " << std::endl;std::string imageFile = "/home/momenta/AI/c++_project_test/right-frontal.jpg";// Take arguments from commmand lineif (argc == 2){imageFile = argv[1];}float thresh = 0.1;cv::Mat frame = cv::imread(imageFile);cv::Mat frameCopy = frame.clone();int frameWidth = frame.cols;int frameHeight = frame.rows;float aspect_ratio = frameWidth/(float)frameHeight;int inHeight = 368;int inWidth = (int(aspect_ratio*inHeight) * 8) / 8;std::cout << "framenWidth = " << frameWidth << " ; frameHeight = " << frameHeight << std::endl;std::cout << "inWidth = " << inWidth << " ; inHeight = " << inHeight << std::endl;double start_time = (double) cv::getTickCount();cv::dnn::Net net = cv::dnn::readNetFromCaffe(protoFile, weightsFile);cv::Mat inpBlob = cv::dnn::blobFromImage(frame, 1.0 / 255, cv::Size(inWidth, inHeight), cv::Scalar(0, 0, 0), false, false);std::cout<<"inpBlob.dims:"<<inpBlob.dims<<std::endl;std::cout<<"inpBlob.size:"<<inpBlob.size<<std::endl;net.setInput(inpBlob);cv::Mat output = net.forward();std::cout<<"output.size:"<<output.size<<std::endl;int H = output.size[2];int W = output.size[3];// find the position of the body partsstd::vector<cv::Point> points(nPoints);for (int i=0; i < nPoints; i++){// Probability map of corresponding body's part.cv::Mat probMap(H, W, CV_32F, output.ptr(0, i));std::cout<<"probMapt.size:"<<probMap.size<<std::endl;resize(probMap, probMap, cv::Size(frameWidth, frameHeight));cv::Point maxLoc;double prob;cv::minMaxLoc(probMap, 0, &prob, 0, &maxLoc); // std::cout<<"prob:"<<prob<<std::endl;if (prob > thresh){ // std::cout<<"(int)maxLoc.x:"<<(int)maxLoc.x<<std::endl; // std::cout<<"(int)maxLoc.y:"<<(int)maxLoc.y<<std::endl; // circle(frame, cv::Point((int)maxLoc.x, (int)maxLoc.y), 8, Scalar(0,255,255), -1);cv::putText(frame, std::to_string(i), cv::Point((int)maxLoc.x, (int)maxLoc.y), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255), 2);}points[i] = maxLoc;}int nPairs = sizeof(POSE_PAIRS)/sizeof(POSE_PAIRS[0]);for (int i = 0; i < nPairs; i++){// lookup 2 connected body/hand partscv::Point2f partA = points[POSE_PAIRS[i][0]];cv::Point2f partB = points[POSE_PAIRS[i][1]];if (partA.x<=0 || partA.y<=0 || partB.x<=0 || partB.y<=0)continue;line(frame, partA, partB, cv::Scalar(0,255,255), 8);circle(frame, partA, 8, cv::Scalar(0,0,255), -1);circle(frame, partB, 8, cv::Scalar(0,0,255), -1);}double cost_time = ((double)cv::getTickCount() - start_time)/cv::getTickFrequency();std::cout << "Time Taken = " << cost_time << std::endl;cv::imwrite("Output-Skeleton.jpg", frame);return 0; }

7.cv::projectPoints 通過旋轉(zhuǎn)向量,平移向量與相機(jī)坐標(biāo)系3d點(diǎn)算出投影2d點(diǎn)

有兩種解法一個(gè)是標(biāo)題所述,一個(gè)是用旋轉(zhuǎn)向量計(jì)算出旋轉(zhuǎn)矩陣,用外參和內(nèi)參變化計(jì)算出投影2d點(diǎn).

python:

#!/usr/bin/env pythonimport cv2 import numpy as npdef method_one(rotation_matrix, translation_vector, camera_matrix, dist_coeffs, start_point):cam_3d = rotation_matrix.dot(start_point.reshape(-1, 1)) + translation_vectorprint('==cam_3d:', cam_3d)def camera_to_img2d(x, K, Kd):"""x(3, N)"""x[0:2, :] = x[0:2, :] / x[2, :] # (2, N)r = x[0, :] * x[0, :] + x[1, :] * x[1, :] # x^2 + y^2 (N, )x[0, :] = x[0, :] * (1 + Kd[0] * r + Kd[1] * r * r + Kd[4] * r * r * r) + 2 * Kd[2] * x[0, :] * x[1, :] + Kd[3] * (r + 2 * x[0, :] * x[0, :])x[1, :] = x[1, :] * (1 + Kd[0] * r + Kd[1] * r * r + Kd[4] * r * r * r) + 2 * Kd[3] * x[0, :] * x[1, :] + Kd[2] * (r + 2 * x[1, :] * x[1, :])x[0, :] = K[0, 0] * x[0, :] + K[0, 1] * x[1, :] + K[0, 2]x[1, :] = K[1, 0] * x[0, :] + K[1, 1] * x[1, :] + K[1, 2]return x_2d = camera_to_img2d(cam_3d, camera_matrix, dist_coeffs)# print('==_2d:', _2d)return _2d def method_two(rotation_vector, translation_vector, camera_matrix, dist_coeffs, start_point):# Project a 3D point (0, 0, 1000.0) onto the image plane.# We use this to draw a line sticking out of the nose(nose_end_point2D, jacobian) = cv2.projectPoints(start_point, rotation_vector, translation_vector, camera_matrix, dist_coeffs)# print('==nose_end_point2D:', nose_end_point2D)return nose_end_point2Ddef main():# Read Imageim = cv2.imread("headPose.jpg")size = im.shape# 2D image points. If you change the image, you need to change vectorimage_points = np.array([(359, 391), # Nose tip(399, 561), # Chin(337, 297), # Left eye left corner(513, 301), # Right eye right corne(345, 465), # Left Mouth corner(453, 469) # Right mouth corner], dtype=np.float32)# 3D model points.model_points = np.array([(0.0, 0.0, 0.0), # Nose tip(0.0, -330.0, -65.0), # Chin(-225.0, 170.0, -135.0), # Left eye left corner(225.0, 170.0, -135.0), # Right eye right corne(-150.0, -150.0, -125.0), # Left Mouth corner(150.0, -150.0, -125.0) # Right mouth corner])# Camera internalsfocal_length = size[1]center = (size[1] / 2, size[0] / 2)camera_matrix = np.array([[focal_length, 0, center[0]],[0, focal_length, center[1]],[0, 0, 1]], dtype="double")print("Camera Matrix :\n {0}".format(camera_matrix))dist_coeffs = np.zeros((5, 1)) # Assuming no lens distortion(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points, camera_matrix,dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)rotation_matrix = cv2.Rodrigues(rotation_vector)[0]print("Rotation Vector:\n {0}".format(rotation_vector))print('rotation_matrix:\n', rotation_matrix)print("Translation Vector:\n {0}".format(translation_vector))start_point = np.array([(0.0, 0.0, 1000.0)])one_nose_end_point2D = method_one(rotation_matrix, translation_vector, camera_matrix, dist_coeffs, start_point)two_nose_end_point2D = method_two(rotation_vector, translation_vector, camera_matrix, dist_coeffs, start_point)print('==one_nose_end_point2D:\n', one_nose_end_point2D)print('==two_nose_end_point2D:\n', two_nose_end_point2D)for p in image_points:cv2.circle(im, (int(p[0]), int(p[1])), 3, (0, 0, 255), -1)p1 = (int(image_points[0][0]), int(image_points[0][1]))p2 = (int(two_nose_end_point2D[0][0][0]), int(two_nose_end_point2D[0][0][1]))cv2.line(im, p1, p2, (255, 0, 0), 2) if __name__ == '__main__':main()

c++:

#include <opencv2/opencv.hpp>using namespace std; using namespace cv;void method_two( vector<Point3d> &nose_end_point3D, vector<Point2d> &nose_end_point2D,cv::Mat &rotation_vector, cv::Mat &translation_vector, cv::Mat &camera_matrix, cv::Mat &dist_coeffs){projectPoints(nose_end_point3D, rotation_vector, translation_vector, camera_matrix, dist_coeffs, nose_end_point2D); }void camera3d_to_img_2d(cv::Mat& x, cv::Mat &K, cv::Mat &Kd){x.rowRange(0, 2) = x.rowRange(0, 2) / x.row(2);cv::Mat r = x.row(0) * x.row(0) + x.row(1) * x.row(1);x.row(0) = x.row(0) * (1 + Kd.at<double>(0) * r + Kd.at<double>(1)*r*r + Kd.at<double>(4)*r*r*r) +2*Kd.at<double>(2)*x.row(0)*x.row(1) + Kd.at<double>(3)*(r + 2*x.row(0)*x.row(0));x.row(1) = x.row(1) * (1 + Kd.at<double>(0) * r + Kd.at<double>(1)*r*r + Kd.at<double>(4)*r*r*r) +2*Kd.at<double>(2)*x.row(0)*x.row(1) + Kd.at<double>(2)*(r + 2*x.row(1)*x.row(1));x.row(0) = K.at<double>(0, 0) * x.row(0) + K.at<double>(0, 1) * x.row(1) + K.at<double>(0, 2);x.row(1) = K.at<double>(1, 0) * x.row(0) + K.at<double>(1, 1) * x.row(1) + K.at<double>(1, 2);} void method_one( vector<Point3d> &nose_end_point3D, vector<Point2d> &nose_end_point2D,cv::Mat &rotation_matrix, cv::Mat translation_vector, cv::Mat &camera_matrix, cv::Mat &dist_coeffs){cv::Mat start_point = cv::Mat(nose_end_point3D);start_point = start_point.reshape(1, 3);start_point.convertTo(start_point, rotation_matrix.type()); // cout<<"start_point.rows:"<<start_point.rows<<endl; // cout<<start_point.cols<<endl; // cout<<rotation_matrix.rows<<endl; // cout<<"rotation_matrix.cols:"<<rotation_matrix.cols<<endl; // cout<<"start_point:"<<start_point<<endl; // cout<<"start_point.type():"<<start_point.type()<<endl;cv::Mat cam_3d = rotation_matrix*start_point + translation_vector; // cout<<cam_3d<<endl;camera3d_to_img_2d(cam_3d, camera_matrix, dist_coeffs);nose_end_point2D = cv::Mat_<Point2d>(cam_3d.rowRange(0, 2)); } int main(int argc, char **argv) {// Read input imagecv::Mat im = cv::imread("/home/momenta/AI/c++_project_test/headPose.jpg");// 2D image points. If you change the image, you need to change vectorstd::vector<cv::Point2d> image_points;image_points.push_back( cv::Point2d(359, 391) ); // Nose tipimage_points.push_back( cv::Point2d(399, 561) ); // Chinimage_points.push_back( cv::Point2d(337, 297) ); // Left eye left cornerimage_points.push_back( cv::Point2d(513, 301) ); // Right eye right cornerimage_points.push_back( cv::Point2d(345, 465) ); // Left Mouth cornerimage_points.push_back( cv::Point2d(453, 469) ); // Right mouth corner// 3D model points.std::vector<cv::Point3d> model_points;model_points.push_back(cv::Point3d(0.0f, 0.0f, 0.0f)); // Nose tipmodel_points.push_back(cv::Point3d(0.0f, -330.0f, -65.0f)); // Chinmodel_points.push_back(cv::Point3d(-225.0f, 170.0f, -135.0f)); // Left eye left cornermodel_points.push_back(cv::Point3d(225.0f, 170.0f, -135.0f)); // Right eye right cornermodel_points.push_back(cv::Point3d(-150.0f, -150.0f, -125.0f)); // Left Mouth cornermodel_points.push_back(cv::Point3d(150.0f, -150.0f, -125.0f)); // Right mouth corner// Camera internalsdouble focal_length = im.cols; // Approximate focal length.Point2d center = cv::Point2d(im.cols/2,im.rows/2);cv::Mat camera_matrix = (cv::Mat_<double>(3,3) << focal_length, 0, center.x,0 , focal_length, center.y,0, 0, 1);cv::Mat dist_coeffs = cv::Mat::zeros(5,1,cv::DataType<double>::type); // Assuming no lens distortioncout << "Camera Matrix " << endl << camera_matrix << endl ;// Output rotation and translationcv::Mat rotation_vector; // Rotation in axis-angle formcv::Mat translation_vector;// Solve for posecv::solvePnP(model_points, image_points, camera_matrix, dist_coeffs, rotation_vector, translation_vector);cout<<"rotation_vector:"<<rotation_vector<<endl;cout<<"translation_vector:"<<translation_vector<<endl;cv::Mat rotation_matrix;cv::Rodrigues(rotation_vector,rotation_matrix);cout<<"rotation_matrix:"<<rotation_matrix<<endl;cout<<rotation_matrix.type()<<endl;// Project a 3D point (0, 0, 1000.0) onto the image plane.// We use this to draw a line sticking out of the nosevector<Point2d> one_nose_end_point2D;vector<Point3d> one_nose_end_point3D;one_nose_end_point3D.push_back(Point3d(0,0,1000.0));method_one(one_nose_end_point3D, one_nose_end_point2D,rotation_matrix, translation_vector, camera_matrix, dist_coeffs);cout<<"one_nose_end_point2D:"<<one_nose_end_point2D<<endl;vector<Point2d> two_nose_end_point2D;vector<Point3d> two_nose_end_point3D;two_nose_end_point3D.push_back(Point3d(0,0,1000.0));method_two(two_nose_end_point3D, two_nose_end_point2D, rotation_vector, translation_vector, camera_matrix, dist_coeffs);cout<<"two_nose_end_point2D:"<<two_nose_end_point2D<<endl;for(int i=0; i < image_points.size(); i++){circle(im, image_points[i], 3, Scalar(0,0,255), -1);}cv::line(im,image_points[0], two_nose_end_point2D[0], cv::Scalar(255,0,0), 2);cv::imwrite("./im_show.jpg", im);}

8.cv::floodFill?泛洪算法

python:

#!/usr/bin/env pythonimport cv2; import numpy as np;# Read image im_in = cv2.imread("nickel.jpg", cv2.IMREAD_GRAYSCALE)# Threshold. # Set values equal to or above 220 to 0. # Set values below 220 to 255.th, im_th = cv2.threshold(im_in, 220, 255, cv2.THRESH_BINARY_INV)# Copy the thresholded image. im_floodfill = im_th.copy()# Mask used to flood filling. # Notice the size needs to be 2 pixels than the image. h, w = im_th.shape[:2] mask = np.zeros((h+2, w+2), np.uint8)# Floodfill from point (0, 0) cv2.floodFill(im_floodfill, mask, (0, 0), 255)# Invert floodfilled image im_floodfill_inv = cv2.bitwise_not(im_floodfill)# Combine the two images to get the foreground. im_out = im_th | im_floodfill_inv# Display images. cv2.imwrite("./Thresholded_Image.jpg", im_th) cv2.imwrite("./Floodfilled_Image.jpg", im_floodfill) cv2.imwrite("./Inverted_Floodfilled_Image.jpg", im_floodfill_inv) cv2.imwrite("./Foreground.jpg", im_out)

c++:

#include "opencv2/opencv.hpp"//using namespace cv;int main(int argc, char **argv) {// Read imagecv::Mat im_in = cv::imread("./nickel.jpg", cv::IMREAD_GRAYSCALE);// Threshold.// Set values equal to or above 220 to 0.// Set values below 220 to 255.cv::Mat im_th;cv::threshold(im_in, im_th, 220, 255, cv::THRESH_BINARY_INV);// Floodfill from point (0, 0)cv::Mat im_floodfill = im_th.clone();cv::floodFill(im_floodfill, cv::Point(0,0), cv::Scalar(255));// Invert floodfilled imagecv::Mat im_floodfill_inv;cv::bitwise_not(im_floodfill, im_floodfill_inv);// Combine the two images to get the foreground.cv::Mat im_out = (im_th | im_floodfill_inv);// Display imagescv::imwrite("Thresholded_Image.jpg", im_th);cv::imwrite("Floodfilled_Image.jpg", im_floodfill);cv::imwrite("Inverted_Floodfilled_Image.jpg", im_floodfill_inv);cv::imwrite("Foreground.jpg", im_out);}

?

9.cv::findHomography

傳兩個(gè)圖像里的點(diǎn)集合,它會找到那個(gè)目標(biāo)的透視轉(zhuǎn)換,需要至少4個(gè)正確的點(diǎn)來找變換。

python:

#!/usr/bin/env pythonimport cv2 import numpy as npdef mouse_handler(event, x, y, flags, data):if event == cv2.EVENT_LBUTTONDOWN:cv2.circle(data['im'], (x, y), 3, (0, 0, 255), 5, 16);cv2.imshow("Image", data['im']);if len(data['points']) < 4:data['points'].append([x, y])def get_four_points(im):# Set up data to send to mouse handlerdata = {}data['im'] = im.copy()data['points'] = []# Set the callback function for any mouse eventcv2.imshow("Image", im)cv2.setMouseCallback("Image", mouse_handler, data)cv2.waitKey(0)# Convert array to np.arraypoints = np.vstack(data['points']).astype(float)return pointsif __name__ == '__main__' :# Read in the image.im_src = cv2.imread("book1.jpg")# Destination imagesize = (300, 400, 3)im_dst = np.zeros(size, np.uint8)pts_dst = np.array([[0, 0],[size[0] - 1, 0],[size[0] - 1, size[1] -1],[0, size[1] - 1]], dtype=float)# Show image and wait for 4 clicks.# cv2.imshow("Image", im_src)pts_src = get_four_points(im_src)print('==pts_src:', pts_src)# Calculate the homographymatrix, status = cv2.findHomography(pts_src, pts_dst)print('==matrix:', matrix)# Warp source image to destinationim_dst = cv2.warpPerspective(im_src, matrix, size[0:2])print('==im_dst.shape:', im_dst.shape)# Show outputcv2.imshow("Image", im_dst)cv2.waitKey(0)

c++:

#include <opencv2/opencv.hpp>//using namespace cv; using namespace std;struct userdata{cv::Mat im;vector<cv::Point2f> points; };void mouseHandler(int event, int x, int y, int flags, void* data_ptr) {if ( event == cv::EVENT_LBUTTONDOWN ){userdata *data = ((userdata *) data_ptr);cv::circle(data->im, cv::Point(x,y),3,cv::Scalar(0,0,255), 5, cv::LINE_AA);imshow("Image", data->im);if (data->points.size() < 4){data->points.push_back(cv::Point2f(x,y));}} }int main( int argc, char** argv) {// Read source image.cv::Mat im_src = cv::imread("/home/fzh/AI/C_learn/datastruct/opencv/book1.jpg");// Destination image. The aspect ratio of the book is 3/4cv::Size size(300,400);cv::Mat im_dst = cv::Mat::zeros(size,CV_8UC3);// Create a vector of destination points.vector<cv::Point2f> pts_dst;pts_dst.push_back(cv::Point2f(0,0));pts_dst.push_back(cv::Point2f(size.width - 1, 0));pts_dst.push_back(cv::Point2f(size.width - 1, size.height -1));pts_dst.push_back(cv::Point2f(0, size.height - 1 ));// Set data for mouse eventcv::Mat im_temp = im_src.clone();userdata data;data.im = im_temp;cout << "Click on the four corners of the book -- top left first and" << endl<< "bottom left last -- and then hit ENTER" << endl;// Show image and wait for 4 clicks.imshow("Image", im_temp);// Set the callback function for any mouse eventcv::setMouseCallback("Image", mouseHandler, &data);cout<<"data.im.rows:"<<data.im.rows<<endl;cout<<"data.im.cols:"<<data.im.cols<<endl;cout<<"data.im.channels():"<<data.im.channels()<<endl;cv::waitKey(0);// Calculate the homographycv::Mat matrix = cv::findHomography(data.points, pts_dst);cout<<"data.points:"<<data.points<<endl;// Warp source image to destinationcv::warpPerspective(im_src, im_dst, matrix, size);// Show imagecv::imshow("Image", im_dst);cv::waitKey(0);cv::imwrite("./dst.jpg",im_dst);return 0; }//

?

10. cv2::moments 尋找質(zhì)心

python:

import cv2 import numpy as np import argparse# # create object to pass argument # arg_parse = argparse.ArgumentParser() # arg_parse.add_argument("-i", "--ipimage", required=True, # help="input image path") # args = vars(arg_parse.parse_args()) img_path = './circle.png' # read image through command line img = cv2.imread(img_path)# convert image to grayscale image gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# convert the grayscale image to binary image ret, thresh = cv2.threshold(gray_image, 127, 255, 0)cv2.imwrite('./thresh.jpg', thresh) # calculate moments of binary image M = cv2.moments(thresh) print('==M:', M) print('==M.keys()', M.keys()) # calculate x,y coordinate of center cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"])# put text and highlight the center cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1) cv2.putText(img, "centroid", (cX - 25, cY - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) cv2.imwrite('./img_show.jpg', img)

c++:

//#include "opencv2/highgui/highgui.hpp" //#include "opencv2/imgproc/imgproc.hpp" #include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> #include <stdlib.h>using namespace cv; using namespace std;int main(int argc, char** argv) {// Declare Mat type imagesMat src, gray,thr;string img_path="/home/momenta/AI/c++_project_test/circle.png";//Load source image, convert it to graysrc = imread(img_path, 1 );// convert image to grayscalecvtColor(src, gray, COLOR_BGR2GRAY );// convert grayscale to binary imagethreshold( gray, thr, 100,255,THRESH_BINARY );// find moments of the imageMoments m = moments(thr,true);cv::Point2i p(m.m10/m.m00, m.m01/m.m00);// coordinates of centroidcout<< "Mat(p):"<< Mat(p)<< endl;cout<< "p:"<< p<< endl;// show the image with a point mark at the centroidcircle(src, p, 5, Scalar(128,0,0), -1);p.x -= 25;p.y -= 25;cv::putText(src, "centroid", p, cv::FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255), 2);imwrite("./img_show.jpg",src); // imshow("Image with center",src); // waitKey(0); }

多個(gè)圖案的;

python:

import cv2 import numpy as np import argparse# create object to pass argument # arg_parse = argparse.ArgumentParser() # arg_parse.add_argument("-i", "--ipimage", required=True, # help="input image path") # args = vars(arg_parse.parse_args()) img_path = './multiple-blob.png' # read image through command line img = cv2.imread(img_path) # convert the image to grayscale gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert the grayscale image to binary image ret, thresh = cv2.threshold(gray_image, 127, 255, 0) cv2.imwrite('./thresh.jpg', thresh) # find contour in the binary image contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print(hierarchy.shape) print(hierarchy) # [-1, -1, 1, -1; # 2, -1, -1, 0; # 3, 1, -1, 0; # 4, 2, -1, 0; # 5, 3, -1, 0; # 7, 4, 6, 0; # -1, -1, -1, 5; # -1, 5, -1, 0] print(len(contours)) for c in contours[1:]:# calculate moments for each contourM = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])# calculate x,y coordinate of centercv2.circle(img, (cX, cY), 5, (0, 0, 0), -1)cv2.putText(img, "centroid", (cX - 25, cY - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2) # # display the imagecv2.findContourscv2.imshow("Image", img)cv2.waitKey(0)

c++:

//#include "opencv2/highgui/highgui.hpp" //#include "opencv2/imgproc/imgproc.hpp" #include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> #include <stdlib.h>using namespace cv; using namespace std;RNG rng(12345);void find_moments( Mat src );int main(int argc, char** argv) {string img_path="/home/momenta/AI/c++_project_test/multiple-blob.png";/// Load source image, convert it to grayMat src, gray;src = imread(img_path, 1 );cvtColor( src, gray, COLOR_BGR2GRAY );Mat thresh;vector<vector<Point2i> > contours;vector<Vec4i> hierarchy;/// Detect edges using canny // Canny( gray, canny_output, 50, 150, 3 );// Find contoursthreshold(gray, thresh, 127,255,THRESH_BINARY );findContours( thresh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );cout<<Mat(hierarchy)<<endl;cout<<Mat(hierarchy).size<<endl;/// Get the momentsvector<Moments> mu(contours.size());for( int i = 0; i < contours.size(); i++ ){ mu[i] = moments( contours[i], false ); }/// Get the centroid of figures.vector<Point2f> mc(contours.size());for( int i = 0; i < contours.size(); i++ ){mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00);}/// Draw contoursfor( int i = 0; i< contours.size(); i++ ){Scalar color = Scalar(0,0,0); // drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );circle(src, mc[i], 4, color, -1, 7, 0 );mc[i].x -=25;mc[i].y -=25;cv::putText(src, "centroid", mc[i], cv::FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0), 2);}/// Show the resultant imageimwrite("./img_show.jpg", src);return(0); }

?

11.cv2::applyColorMap與cv::Rect切ROI

python:

import cv2 import numpy as npdef colormap_name(id):switcher = {0: "COLORMAP_AUTUMN",1: "COLORMAP_BONE",2: "COLORMAP_JET",3: "COLORMAP_WINTER",4: "COLORMAP_RAINBOW",5: "COLORMAP_OCEAN",6: "COLORMAP_SUMMER",7: "COLORMAP_SPRING",8: "COLORMAP_COOL",9: "COLORMAP_HSV",10: "COLORMAP_PINK",11: "COLORMAP_HOT"}return switcher.get(id, "NONE")if __name__ == '__main__':im = cv2.imread("./pluto.jpg", cv2.IMREAD_GRAYSCALE)im_out = np.zeros((600, 800, 3), np.uint8)for i in range(0, 4):for j in range(0, 3):k = i + j * 4im_color = cv2.applyColorMap(im, k)cv2.putText(im_color, colormap_name(k), (30, 180), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255), 1)im_out[j*200: j*200 + 200, i*200: i*200 + 200, :] = im_colorcv2.imwrite('./im_out.jpg', im_out)

c++:

#include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> #include <stdlib.h>using namespace cv; using namespace std;string colormap_name(int id) {switch(id){case COLORMAP_AUTUMN :return "COLORMAP_AUTUMN";case COLORMAP_BONE :return "COLORMAP_BONE";case COLORMAP_JET :return "COLORMAP_JET";case COLORMAP_WINTER :return "COLORMAP_WINTER";case COLORMAP_RAINBOW :return "COLORMAP_RAINBOW";case COLORMAP_OCEAN :return "COLORMAP_OCEAN";case COLORMAP_SUMMER:return "COLORMAP_SUMMER";case COLORMAP_SPRING :return "COLORMAP_SPRING";case COLORMAP_COOL :return "COLORMAP_COOL";case COLORMAP_HSV :return "COLORMAP_HSV";case COLORMAP_PINK :return "COLORMAP_PINK";case COLORMAP_HOT :return "COLORMAP_HOT";}return "NONE"; }int main(){// Read 8-bit grayscale imageMat im = imread("pluto.jpg", IMREAD_GRAYSCALE);cout<<im.cols<<endl;cout<<im.rows<<endl;Mat im_out = Mat::zeros(600, 800, CV_8UC3);for (int i=0; i < 4; i++){for(int j=0; j < 3; j++){int k = i + j * 4;Rect temp_region = Rect(i * 200, j * 200, 200, 200);cout<<"temp_region lx:"<<temp_region.x<<endl;cout<<"temp_region ly:"<<temp_region.y<<endl;Mat im_color = im_out(temp_region);applyColorMap(im, im_color, k);putText(im_color, colormap_name(k), Point(30, 180), cv::FONT_HERSHEY_DUPLEX, 0.5, Scalar::all(255), 1, cv::LINE_AA);}}imwrite("./im_out.jpg", im_out);return 0; };

?

12.cv::convexHull 與cv::drawContours

python:

import cv2 import numpy as np import sysif __name__ == "__main__":if(len(sys.argv)) < 2:file_path = "sample.jpg"else:file_path = sys.argv[1]# read imagesrc = cv2.imread(file_path, 1)# show source imagecv2.imshow("Source", src)# convert image to gray scalegray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)# blur the imageblur = cv2.blur(gray, (3, 3))# binary thresholding of the imageret, thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)# find contourscontours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, \cv2.CHAIN_APPROX_SIMPLE)# create hull array for convexHull pointshull = []# calculate points for each contourfor i in range(len(contours)):hull.append(cv2.convexHull(contours[i], False))# create an empty black imagedrawing = np.zeros((thresh.shape[0], thresh.shape[1], 3), np.uint8)# draw contours and hull pointsfor i in range(len(contours)):color_contours = (0, 255, 0) # color for contourscolor = (255, 255, 255) # color for convex hull# draw contourscv2.drawContours(drawing, contours, i, color_contours, 2, 8, hierarchy)# draw convex hullcv2.drawContours(drawing, hull, i, color, 2, 8)cv2.imshow("Output", drawing)cv2.waitKey(0)cv2.destroyAllWindows()

c++:

//#include "opencv2/highgui/highgui.hpp" //#include "opencv2/imgproc/imgproc.hpp" #include <opencv2/opencv.hpp> #include <iostream> #include <cstdlib>using namespace cv; using namespace std;int main(int argc, char** argv) {string image_path; // image path for input imageif(argc < 2)image_path = "sample.jpg";elseimage_path = argv[1];// declare imagesMat src, gray, blur_image, threshold_output;// take input imagesrc = imread(image_path, 1);cout<<"src.rows:"<<src.rows<<endl;cout<<"src.cols:"<<src.cols<<endl;cout<<"src.channels():"<<src.channels()<<endl;// convert to grayscalecvtColor(src, gray, COLOR_BGR2GRAY);// add blurring to the input imageblur(gray, blur_image, Size(3, 3));// binary threshold the input imagethreshold(gray, threshold_output, 200, 255, THRESH_BINARY);// show source image // namedWindow("Source", WINDOW_AUTOSIZE); // imshow("Source", src);// Convex Hull implementationsMat src_copy = src.clone();// contours vectorvector<vector<Point>> contours;vector<Vec4i> hierarchy;// find contours for the thresholded imagefindContours(threshold_output, contours, hierarchy, RETR_TREE,CHAIN_APPROX_SIMPLE, Point(0, 0));// create convex hull vectorvector<vector<Point2i>> hull(contours.size());// find convex hull for each contourfor(int i = 0; i < contours.size(); i++){convexHull(Mat(contours[i]), hull[i], false); // cout<<"hull[i]:"<<hull[i].size()<<endl;}// create empty black imageMat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);// draw contours and convex hull on the empty black imagefor(int i = 0; i < contours.size(); i++) {Scalar color_contours = Scalar(0, 255, 0); // color for contours : greenScalar color = Scalar(255, 255, 255); // color for convex hull : white// draw contoursdrawContours(drawing, contours, i, color_contours, 2, 8, vector<Vec4i>(), 0, Point());// draw convex hulldrawContours(drawing, hull, i, color, 2, 8, vector<Vec4i>(), 0, Point());}imwrite("./drawing.jpg",drawing); // namedWindow("Output", WINDOW_AUTOSIZE); // imshow("Output", drawing); // // waitKey(0);return 0; }

??

13.cv::Point系列與修改像素值

可以看見沒有unsigned char

可以自己寫一個(gè)

typedef cv::Point3_<uint8_t> Pixel;

注意的是unsigned char 打印的是ascii瑪,需要轉(zhuǎn)一下才能打印值,可以通過上訴形式,取像素值進(jìn)行修改.

方法1:通過for循環(huán)修改像素值

void complicatedThreshold(Pixel &pixel) { // if (pow(double(pixel.x)/10,2.5) > 100)if (double(pixel.x)/10 > 10){pixel.x = 255;pixel.y = 255;pixel.z = 255;}else{pixel.x = 0;pixel.y = 0;pixel.z = 0;} }for (int i = 0; i < image.rows; i++){// Loop over all columnsfor ( int j = 0; j < image.cols; j++){Pixel pixel = image.at<Pixel>(i,j);cout<<"int(pixel.x)"<<int(pixel.x)<<int(pixel.y)<<int(pixel.z)<<endl;// Apply complicatedTresholdcomplicatedThreshold(pixel);// Put result backimage.at<cv::Vec3b>(i,j) = pixel;}} cv::imwrite("image.jpg", image);

方法2:指針

cv::Mat image1 = image.clone();Pixel* pixel = image1.ptr<Pixel>(0,0);// Mat objects created using the create method are stored // // in one continous memory block.const Pixel* endPixel = pixel + image1.cols * image1.rows; // // // Loop over all pixelsfor (; pixel != endPixel; pixel++){complicatedThreshold(*pixel);}cv::imwrite("image1_th.jpg", image1);

??

14.cv::Range切片

cv::Mat probMap = (cv::Mat_<float>(3, 3) <<0,10,0,1,2,3,4,5,6);cv::Point maxLoc;double prob;cout<<"probMap:"<<probMap<<endl;cv::minMaxLoc(probMap, 0, &prob, 0, &maxLoc);cout<<"maxLoc.x:"<<maxLoc.x<<endl;cout<<"maxLoc.y"<<maxLoc.y<<endl;cv::Mat roi = probMap(cv::Range(0, 2), cv::Range(0, 1));cout<<"==roi:"<<roi<<endl;cout<<"==roi.size:"<<roi.size<<endl;

15.合成圖片

// 構(gòu)建新圖像的大小int width = src1.cols + src2.cols;int height = max(src1.rows, src2.rows);cv::Mat two = cv::Mat::zeros(cv::Size(width, height), src1.type());// 構(gòu)建ROIcv::Rect r1(0, 0, src1.cols, src1.rows);cv::Rect r2(0, 0, src2.cols, src2.rows);cout<<"==r2.x:"<<r2.x<<endl;cout<<"==r2.y:"<<r2.y<<endl;cout<<"==r2.height:"<<r2.height<<endl;cout<<"==r2.width:"<<r2.width<<endl;r2.x = src1.cols;r2.y = 0;// 內(nèi)容copysrc1.copyTo(two(r1));src2.copyTo(two(r2));cout<<"==two.rows:"<<two.rows<<endl;cout<<"==two.cols:"<<two.cols<<endl;cv::imwrite("./merge.jpg", two);

16.遍歷文件夾圖片cv::glob

std::vector<cv::String> imgs_list_path;// Path of the folder containing checkerboard imagesstd::string img_dir_path = "../imgs/*";cv::glob(img_dir_path, imgs_list_path);for(size_t i=0; i < imgs_list_path.size(); i++){cout<<"imgs_list_path[i]:"<<imgs_list_path[i]<<endl;}

總結(jié)

以上是生活随笔為你收集整理的C++ opencv的一些基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日韩中文在线字幕 | 男女视频久久久 | 免费在线成人av电影 | 日韩色av色资源 | 青青河边草免费视频 | 岛国av在线 | 国产精品成 | 人人澡人人爽欧一区 | 99久久久国产精品免费观看 | 国产精品久久久久久久电影 | 久久99九九99精品 | 日韩欧美区 | 亚洲成人精品在线观看 | 久久久久高清毛片一级 | 久久精品人人做人人综合老师 | 天天综合网在线 | 久久久久久久久久影院 | 99久久www免费 | 国产精品美女久久久久久2018 | 亚洲精品在线观看免费 | 91视频在线免费看 | 成人免费视频网 | 最新日韩精品 | 亚洲综合精品在线 | 91探花国产综合在线精品 | 99超碰在线播放 | 久久久久久国产精品久久 | 人人爽人人爽av | 欧美日韩精品免费观看视频 | 欧美日韩精| 中文字幕丝袜美腿 | 日本丶国产丶欧美色综合 | 中文字幕五区 | 91在线影视| 四虎国产精品永久在线国在线 | 99九九免费视频 | 91资源在线 | 国产日本亚洲高清 | 日韩欧美一区二区三区视频 | 人人澡人人爱 | 天天爱天天操天天爽 | 久草视频精品 | 亚洲一区二区三区四区精品 | 亚洲视频在线看 | 国产精品6 | 中文字幕成人在线观看 | 91av中文字幕 | 婷婷丁香激情网 | 亚洲精品影视在线观看 | av综合 日韩 | 久久夜色电影 | 久久毛片网 | 人交video另类hd | a视频免费 | 激情五月婷婷激情 | 国产伦精品一区二区三区四区视频 | 国产麻豆精品久久 | 欧美日韩视频在线观看一区二区 | 久久免费观看少妇a级毛片 久久久久成人免费 | 国产一级淫片在线观看 | 国产91九色视频 | 午夜精品一区二区三区免费视频 | www日韩欧美 | 日韩欧美v | 亚洲经典在线 | 欧美大片mv免费 | 日韩在线免费小视频 | 99精品久久久久久久 | 丁香婷婷综合网 | 九九久久视频 | 99久久精品免费看国产一区二区三区 | 91视频在线观看下载 | 又黄又爽的免费高潮视频 | 伊人春色电影网 | 久草在在线 | a√天堂资源 | 深夜福利视频一区二区 | 国产成人一区二区在线观看 | 中文字幕888 | 欧美国产日韩一区二区三区 | 97超碰免费在线观看 | 亚洲国产成人高清精品 | 丁香六月五月婷婷 | 成人黄大片视频在线观看 | 国产免费一区二区三区最新 | 日日夜夜亚洲 | 亚洲国产欧美在线看片xxoo | 国产精品久久久久久一区二区三区 | 国产精品久久99 | 福利一区在线 | 国语精品久久 | 亚洲一级黄色大片 | 久久99精品久久久久久清纯直播 | 亚洲一区二区三区毛片 | 18久久久 | 九九爱免费视频在线观看 | 久久久久久久精 | 国产麻豆传媒 | 久久视频一区 | 色九九在线 | 成av在线 | 欧美成年性 | 在线观看你懂的网址 | 国产精品久久久久aaaa | 国产专区日韩专区 | 97超视频免费观看 | 国产人成一区二区三区影院 | 一区二区三区高清在线 | 久艹在线免费观看 | 四虎影视成人永久免费观看亚洲欧美 | 国产无区一区二区三麻豆 | 国产成人一区二区啪在线观看 | 亚洲天天摸日日摸天天欢 | 久久视频二区 | 日本久久片 | 99精品在线观看 | 五月导航 | av在线激情 | 亚洲 欧美 日韩 综合 | av青草| 国产最新在线 | 五月天天天操 | 国产精品精品视频 | 婷婷国产一区二区三区 | 人人看97| 日韩在线免费高清视频 | 国产黄色a | 亚洲综合色激情五月 | 99精品免费久久久久久久久 | 久久久久久久久久久高潮一区二区 | 久久国产免费视频 | 欧美日韩电影在线播放 | 亚洲天堂网站 | 久久中文精品视频 | 欧美一性一交一乱 | 色婷婷综合成人av | 免费在线黄色av | 国产精品白浆视频 | 亚洲国产天堂av | 亚洲精品一区二区网址 | 日日日视频 | av在线播放国产 | 久草在线免费资源 | 国产男女无遮挡猛进猛出在线观看 | 国产一级精品绿帽视频 | 欧美一级日韩三级 | 日韩精品欧美专区 | 午夜精品视频免费在线观看 | 国产小视频在线观看 | 欧美精品v国产精品v日韩精品 | 欧美一级黄色片 | 在线免费视频一区 | 91av影视 | 国产亚洲精品久久久久久电影 | 成年人视频在线免费观看 | 久久精品国产精品亚洲精品 | 99热99| 欧美午夜精品久久久久 | 久草观看 | 中文字幕日韩免费视频 | 91伊人久久大香线蕉蜜芽人口 | 玖玖精品视频 | 伊人天堂网 | 不卡的av在线 | 天堂在线免费视频 | a级片久久 | 亚洲国产精品激情在线观看 | 久久久久久蜜av免费网站 | 国产一区二区在线免费播放 | 日韩区在线观看 | 国产精品久久久久9999吃药 | 日韩在线观看视频一区二区三区 | 992tv成人免费看片 | 亚洲国产精品va在线看黑人动漫 | 欧美激情视频久久 | 亚洲va欧洲va国产va不卡 | 午夜精品久久久久99热app | 91av福利视频 | 免费成视频 | 国产精品激情偷乱一区二区∴ | 天天操天天摸天天干 | 欧美中文字幕久久 | 99c视频在线| av三级在线免费观看 | 婷婷亚洲综合五月天小说 | 国产高清视频在线免费观看 | 午夜男人影院 | 中文视频在线播放 | 狠狠干激情 | 中文字幕在线观看第二页 | 久操综合| 一区二区三区 中文字幕 | 久久国产精品小视频 | 在线视频 一区二区 | 日本中文字幕在线 | 在线观看中文av | 成年人免费看的视频 | 国产精品美女网站 | 欧美精品在线观看一区 | 在线免费观看黄色av | 91精品啪在线观看国产81旧版 | 久久一区91| 国精产品999国精产 久久久久 | jizz欧美性9 国产一区高清在线观看 | 国产分类视频 | 亚洲乱码精品久久久 | 亚洲国产合集 | 欧美性色19p | 91亚洲欧美 | 人人超碰97| 激情综合色图 | 西西www4444大胆视频 | 欧美日韩在线第一页 | 91麻豆精品国产 | 不卡的av中文字幕 | 99久久综合狠狠综合久久 | 天天操天天舔天天爽 | 亚洲成人黄色网址 | 日本中文字幕在线电影 | 一区二区欧美激情 | 亚洲国产精品成人va在线观看 | 婷婷网站天天婷婷网站 | 日本在线观看一区二区三区 | 日韩精品一区二区三区高清免费 | 香蕉视频久久久 | 黄色福利网站 | 国产成人一区二区三区在线观看 | 91九色最新| 超碰在线网 | 韩国精品一区二区三区六区色诱 | 日韩手机在线观看 | a√资源在线 | 久久艹艹 | 国产一卡在线 | 成人免费视频视频在线观看 免费 | 亚洲成人精品 | 奇米网在线观看 | 日韩免费观看一区二区三区 | 免费的黄色的网站 | 最近高清中文字幕在线国语5 | 中文字幕一区二区三区在线观看 | 天天艹天天 | 国产午夜在线观看视频 | 成年人视频在线免费观看 | 久久国产精品视频观看 | 东方av免费在线观看 | 国产电影黄色av | 草久草久 | 日韩av专区 | 国产在线观 | 日韩xxxxxxxxx | 黄色在线网站噜噜噜 | 黄色亚洲免费 | 国语黄色片 | 在线免费观看亚洲视频 | 狠狠插天天干 | 日韩精品中文字幕一区二区 | 激情综合啪 | 亚洲japanese制服美女 | 国产99久久精品 | 亚洲免费公开视频 | 久操视频在线免费看 | 国产不卡视频在线 | 日韩精品一区二区在线观看视频 | 中文字幕在线观看第一区 | 日韩精品一卡 | 色噜噜噜噜 | 丁香导航| 开心色插 | 国产精品久久久久久av | 欧美精品日韩 | 精品久久久久久国产 | 婷婷丁香五 | av免费看av | 高清国产一区 | 蜜臀一区二区三区精品免费视频 | 天天操天天拍 | 欧美久久久久久久久久久久久 | 久久精品一二三区白丝高潮 | 久久69精品| 久久手机精品视频 | 免费观看av网站 | 国产美女免费看 | 欧美 激情在线 | 日本三级人妇 | 欧美日韩视频一区二区三区 | av中文字幕在线看 | 摸bbb搡bbb搡bbbb | 久草网免费 | 青青久草在线 | 草久在线观看 | 日韩欧美精品在线 | 精品一区二区免费 | 国产精品电影一区二区 | 成人av网站在线观看 | 九九久久国产 | 欧美一级日韩三级 | 国产精品电影一区二区 | 91精品国自产在线观看 | 色婷婷成人网 | 18做爰免费视频网站 | 欧美电影在线观看 | 国产一级小视频 | 亚洲精品国产拍在线 | 在线免费观看一区二区三区 | 成人h视频在线播放 | 欧美激情在线看 | 一区二区精品在线 | 五月婷婷激情综合 | 久久人人爽人人爽人人片av软件 | 在线免费观看视频你懂的 | 探花视频网站 | 香蕉成人在线视频 | 99精品国产高清在线观看 | 国产一级视屏 | 日本精a在线观看 | 日本精品久久久一区二区三区 | 久久婷婷视频 | 免费观看午夜视频 | 久久伊人操 | 久久免费视屏 | 一区二区三区久久 | 97av视频| 欧美精品在线一区二区 | 黄色a一级视频 | 极品嫩模被强到高潮呻吟91 | 国产精品久久一区二区无卡 | 福利视频导航网址 | 久久久高清 | 国产二区精品 | 免费观看一区二区三区视频 | 成人av免费电影 | 丁香九月婷婷综合 | 欧美日韩一级视频 | 91最新视频| 国产日韩一区在线 | 一区二区精 | a级成人毛片 | 日韩精品91偷拍在线观看 | 欧美福利片在线观看 | 亚洲精选在线 | 日韩毛片久久久 | 国产色网| 欧美色婷 | 国产精品免费不卡 | 久久精品波多野结衣 | 五月婷久 | 亚洲第二色 | 99热最新地址 | 欧美日韩精品综合 | 国产精品第2页 | 狠狠色丁香久久婷婷综合五月 | 国产九九热视频 | 国产伦理久久精品久久久久_ | 福利视频区 | 色99中文字幕 | 久久亚洲二区 | 91网免费观看 | 中文字幕国产亚洲 | 在线观看亚洲专区 | 九色免费视频 | 国产精品国产自产拍高清av | 婷婷久操| 日日操操 | 精品国产一区二区三区久久久蜜月 | 久久综合狠狠综合久久狠狠色综合 | 精品国产午夜 | 亚洲网久久 | 午夜精品电影一区二区在线 | 久久99日韩 | 精品xxx | 免费精品在线 | 亚洲激情| 国产黄色av影视 | 国产精品永久 | 四虎在线影视 | 国产精品久久久久一区二区 | 欧美 亚洲 另类 激情 另类 | 日韩午夜精品 | 成人网444ppp | 国产精品中文字幕在线播放 | 免费在线91 | 亚洲国产成人久久综合 | 天天碰天天操 | 国产一区在线精品 | 二区三区中文字幕 | 久久免费黄色 | 国产一区二区久久久 | 天天综合久久综合 | 欧美极品xxx | 亚洲一区二区高潮无套美女 | 天堂入口网站 | 国产中文在线视频 | 天天干天天上 | 国产精品porn | 免费久久精品视频 | 88av视频| 日韩av一区二区三区 | 伊人日日干| 久久久国产精品人人片99精片欧美一 | 色的网站在线观看 | 久久久久久久影院 | 亚洲精品动漫久久久久 | 国产 精品 资源 | 天天天色综合 | 国产精品va在线观看入 | 国产精品免费人成网站 | 久久99久久精品 | 国产免费国产 | 一本一本久久a久久精品综合 | 午夜视频在线观看一区 | 色综合久久久久综合 | 精品亚洲午夜久久久久91 | 国产精品久免费的黄网站 | 亚洲精品小视频在线观看 | 丝袜精品视频 | 久久天堂网站 | 在线色网站| 久久久久久久久久久黄色 | 黄色大全免费观看 | 亚洲国产日韩欧美 | av播放在线| 狠狠干在线播放 | 久久久精品 一区二区三区 国产99视频在线观看 | 四虎成人精品永久免费av | 成人一级免费电影 | 成人av资源站 | 在线小视频 | 国产一区 在线播放 | 亚州欧美视频 | 精品一区二区在线看 | 天天射天天干天天插 | 免费又黄又爽的视频 | 九七人人干 | 成人三级av | 日本深夜福利视频 | 婷婷伊人综合亚洲综合网 | 国产成人久久av免费高清密臂 | 色婷婷丁香 | 国产va在线观看免费 | 国产亚洲小视频 | 中文国产成人精品久久一 | 国产成人av电影在线 | 特黄特色特刺激视频免费播放 | 最近高清中文在线字幕在线观看 | 亚洲精品乱码久久久久久写真 | 乱子伦av | 日韩av成人在线观看 | 黄色毛片电影 | 国产精品一区二区在线 | 国产精品高 | 九九视频免费在线观看 | 成人午夜在线电影 | 国产精品久久久久久久7电影 | 粉嫩av一区二区三区四区在线观看 | 国产手机视频在线 | 久99久在线视频 | 最近中文字幕免费视频 | 黄色免费网 | 综合网欧美| 久久不卡国产精品一区二区 | 国产小视频你懂的 | 人人爽人人澡人人添人人人人 | 人人插人人做 | 日韩免费看视频 | 欧美性生活大片 | 国产一级精品绿帽视频 | 啪啪免费观看网站 | 久久在现视频 | 亚洲天天综合网 | 亚洲 综合 精品 | 天天五月天色 | 国产精品激情在线观看 | 日韩偷拍精品 | 91麻豆精品国产91久久久无需广告 | 在线观看网站黄 | 国产三级精品在线 | 99久久这里有精品 | 免费久久久 | 在线一二三区 | 久久天天操 | 久久不射电影网 | 青青射| 久久久久久久久久久成人 | 亚洲欧美视频在线观看 | 国产精品久久久久久99 | 五月天精品视频 | 福利区在线观看 | 日韩黄色大片在线观看 | 日韩在线色视频 | 国产96精品| 成人精品国产 | 成人毛片在线观看 | 97人人模人人爽人人少妇 | 99视频精品| 97热视频| 欧美性做爰猛烈叫床潮 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 国产精品福利视频 | 99久久国产免费,99久久国产免费大片 | 久久综合久久鬼 | 一二区av| 婷婷福利影院 | 在线观看国产区 | 二区三区精品 | 国产黄色精品网站 | 最新超碰| 免费亚洲黄色 | 一色av| 国产精品人成电影在线观看 | 亚洲激情婷婷 | 久久视频国产 | 超碰97人| 国产久视频 | 日韩黄色中文字幕 | 欧美亚洲精品在线观看 | 一本一道波多野毛片中文在线 | 国产成人精品免费在线观看 | 久久久久久久久毛片 | 97国产精品免费 | 免费在线观看成人小视频 | 久久国产精品99久久久久久老狼 | 日韩欧美精品在线 | 久草在线视频首页 | 成人午夜黄色影院 | 人人干狠狠操 | 久久永久视频 | 狠狠操夜夜 | 久草视频网 | 在线国产日本 | 免费在线一区二区 | 日韩色爱 | 国产视频精选在线 | 青青草国产在线 | 国产98色在线 | 日韩 | 天堂网一区二区三区 | 91香蕉视频在线下载 | 五月天久久激情 | 中文字幕一区二区三区四区视频 | 国产精品永久免费观看 | 成年人免费在线观看网站 | 午夜精品影院 | 中文字幕电影在线 | 久久免费观看视频 | 欧美性生活小视频 | 久黄色 | 国产精品美女999 | 最新成人av | 国内精品久久久久久中文字幕 | 久久视频这里有久久精品视频11 | 51久久成人国产精品麻豆 | 中文字幕在线播放一区 | 香蕉精品视频在线观看 | 在线国产一区二区三区 | 五月天久久婷婷 | 国产精品福利在线播放 | 人人干人人爽 | 91精品视频播放 | 欧美一级免费黄色片 | 天天做天天爱夜夜爽 | 天天干 天天摸 天天操 | 久久99精品久久久久久久久久久久 | 人人爽人人爽人人爽 | 99 久久久久| av黄色亚洲 | 亚洲精品美女久久17c | 亚洲做受高潮欧美裸体 | 国产精品久久久久久久久蜜臀 | 丁香五香天综合情 | 黄色免费看片网站 | 亚洲影院国产 | 天天爱天天操天天爽 | 国产精品av免费观看 | 免费av一级电影 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美精品天堂 | 国产精品丝袜久久久久久久不卡 | 久久精品免费电影 | 日韩精品免费在线视频 | 亚洲人人射 | 国产精品一区免费观看 | 日韩在线观看中文字幕 | 亚州人成在线播放 | 日韩久久午夜一级啪啪 | 精品999 | 久久综合成人网 | 超碰97人人射妻 | 一级黄色在线免费观看 | avwww在线观看 | 国产二区av | 欧美视频一区二 | 96av麻豆蜜桃一区二区 | 美女黄网久久 | 国产青春久久久国产毛片 | 毛片888 | 久久激五月天综合精品 | 国产区久久 | 久久永久视频 | 深爱五月激情网 | 久久国产免 | 69夜色精品国产69乱 | 久久精品国产免费看久久精品 | 国产视频精选在线 | 久久免费看| 亚洲欧美日韩在线一区二区 | 91久久精| 在线亚洲欧美视频 | 日韩在线观看视频一区二区三区 | 欧美精品国产综合久久 | 亚洲精品久久视频 | 视频一区在线免费观看 | 亚洲国产精品视频在线观看 | 99精品在这里 | 91在线91拍拍在线91 | 成人黄视频 | 久久99精品久久久久久三级 | 丁香五月亚洲综合在线 | av福利在线播放 | 久久96| 日批网站免费观看 | 久久人人97超碰精品888 | 中文字幕视频播放 | 日日摸日日| 国产啊v在线 | 中文字幕第一 | 婷婷视频在线观看 | 最新av电影网址 | 天天操伊人 | 国产精品久久久久永久免费看 | 美女很黄免费网站 | 午夜999| 不卡中文字幕av | 色国产视频 | 91爱爱视频 | 国产在线一区二区三区播放 | 中文字幕一区二区三区在线视频 | 精品福利网站 | 免费看毛片在线 | 亚洲影院色 | 久久五月网 | 久久不卡电影 | 黄色小说网站在线 | 91麻豆国产福利在线观看 | 天天操夜夜干 | 在线成人中文字幕 | 久久精品99国产国产 | 在线中文字幕播放 | 久久免费视屏 | 色婷婷综合久久久 | 国产精品理论片 | 九九电影在线 | 最近中文字幕国语免费av | 蜜臀久久99精品久久久酒店新书 | 欧美精品久久人人躁人人爽 | 射综合网 | 日韩| 日韩二区在线播放 | 成人污视频在线观看 | 日韩精品中文字幕一区二区 | 亚洲区另类春色综合小说 | 免费看成年人 | 国产精品日韩久久久久 | 中文字幕日韩免费视频 | 中文字幕一区二区三区四区在线视频 | 国产在线欧美日韩 | 日韩成人免费在线观看 | 天天爽夜夜爽人人爽曰av | 成人免费视频播放 | 亚洲国产精品资源 | 日韩在线电影一区二区 | 69国产精品视频 | 白丝av在线| 亚洲国产成人精品电影在线观看 | 亚洲视频电影在线 | av 一区二区三区四区 | 在线91色 | 免费在线国产 | 麻豆视频免费在线 | 日韩精品一区二区三区视频播放 | 久久视频这里有久久精品视频11 | 三级免费黄 | 91精品国产成人 | 久久久影片 | 天天插综合网 | 欧美日韩在线播放一区 | 91香蕉嫩草 | 99色免费| 91av免费在线观看 | 亚洲清纯国产 | 久久精品亚洲精品国产欧美 | 日韩av免费在线电影 | 亚洲黄在线观看 | 亚洲免费黄色 | 在线91色| av在线免费网站 | 日韩在线视频精品 | 一区二区电影在线观看 | 人人草网站| 色99久久 | 国产精品自产拍在线观看桃花 | 999久久| 日日麻批40分钟视频免费观看 | av中文资源在线 | 免费黄色a网站 | 五月天天av | 精品欧美一区二区三区久久久 | 久久国产电影院 | 色网站免费在线看 | 最新日韩视频在线观看 | 亚洲高清国产视频 | 婷婷久久一区 | 亚洲狠狠 | 99视频在线精品 | 国产a精品 | 久久成人欧美 | 在线国产激情视频 | 中文字幕一区二 | 亚洲欧美日韩一级 | 成人一区在线观看 | 黄色三级免费网址 | 久久精品免费观看 | 久久久久久精 | 午夜在线观看 | 国产日韩在线视频 | 亚州免费视频 | 天天色天天操天天爽 | 波多野结衣电影一区二区 | 久久综合九色综合网站 | 日韩69视频| 97久久精品午夜一区二区 | 亚洲精品视频在线播放 | 91网在线观看 | 久久久久电影网站 | 麻豆94tv免费版| 99久久久久久久久久 | av在线免费在线观看 | 狠狠干网址| 色婷婷www | 国产h在线观看 | 国产精品免费视频网站 | 免费久久网 | 国产片免费在线观看视频 | 日韩无在线 | av免费在线观 | 久久中文字幕在线视频 | av高清在线观看 | 久久这里只有精品久久 | 国产五月婷 | 中文字幕在线看视频国产 | 久久久精品网站 | www激情网| 精品福利网站 | 狠狠操在线 | 色爽网站 | 午夜在线日韩 | 日本不卡一区二区三区在线观看 | 99 久久久久 | 久久精品一区八戒影视 | 色欧美日韩 | 久久99久久99免费视频 | 日韩精品中文字幕一区二区 | 永久免费精品视频 | 黄色精品久久 | 亚洲精品中文在线资源 | 成人一区不卡 | 国产成人一区二区三区影院在线 | 日韩欧美亚州 | 亚州精品在线视频 | 国产视频在线观看一区 | 日韩在观看线 | 97福利在线 | 丁香六月国产 | 国产一区欧美一区 | www.婷婷com | 日韩免费三区 | 在线观看日韩视频 | 亚洲综合欧美激情 | 久久激情视频免费观看 | 久久涩视频 | 欧美成人a在线 | 色视频网页 | 国产精品日韩欧美一区二区 | www.黄色片网站 | 国产不卡毛片 | 欧美性色19p | 国产a精品 | 国产a国产a国产a | 国产又粗又猛又爽 | www五月 | 香蕉视频在线免费 | 日韩中文字幕在线观看 | 在线观看免费黄视频 | 美女一二三区 | 精品日韩在线 | 国产99一区 | 精品在线观看一区二区三区 | www黄色com | 日韩av免费在线看 | 久草青青在线观看 | 国产精品6 | 91中文字幕在线观看 | 00av视频 | 精品国产一区二区三区av性色 | 国产五月婷婷 | 在线观看免费中文字幕 | 国精产品满18岁在线 | 欧美日韩二区三区 | a资源在线 | 日本中文字幕在线播放 | 久久午夜电影网 | 国产成人一区二区三区电影 | 久久久精品网 | 天天综合精品 | 97电影在线观看 | 三级黄色免费 | 天天操天天舔天天爽 | 久久伦理 | 色夜影院| 日韩激情片在线观看 | 色在线亚洲| 久久毛片视频 | 丁香六月天 | 91亚洲精品久久久蜜桃借种 | 日韩99热| 91av色| 五月天综合色激情 | 日韩高清久久 | 国产成人精品区 | 精品久久免费看 | 91精品国产一区 | 婷婷综合五月 | 国产精品美女在线 | 亚洲精品免费在线 | 欧美日韩综合在线 | 97看片网 | 91视频免费视频 | 欧美在线aaa | 97视频亚洲 | 天天摸天天弄 | 亚洲精品国产综合99久久夜夜嗨 | 天天干天天上 | 91成人精品一区在线播放 | 免费色网 | 91麻豆视频网站 | 人人爽人人澡人人添人人人人 | 91色在线观看视频 | 精品国产精品一区二区夜夜嗨 | 五月婷综合| 国产精品亚洲成人 | 日韩精品视频免费在线观看 | 在线免费观看的av | 国产在线精品一区二区不卡了 | av丝袜在线| wwwww.国产 | 91精品视频在线免费观看 | 国产精品99久久99久久久二8 | 天天综合日日夜夜 | 免费电影播放 | 亚洲码国产日韩欧美高潮在线播放 | 超碰人人射 | 热久久视久久精品18亚洲精品 | 中文字幕欧美激情 | 日韩理论在线播放 | 亚洲黄色片在线 | 成人亚洲精品国产www | 九九视频这里只有精品 | 国产成人精品免费在线观看 | 99久久久国产免费 | 日韩成片 | 成人在线免费看 | 亚洲精品久久久久久久不卡四虎 | 国产亚洲91 | 又污又黄网站 | 伊人久久五月天 | 国内精自线一二区永久 | 国产美女视频免费观看的网站 | 日本黄色a级大片 | 91麻豆精品一区二区三区 | 国产999精品久久久 免费a网站 | 日韩中字在线 | 视频福利在线 | 9999免费视频 | 国产成人一区二区在线观看 | 久久韩国免费视频 | 狠狠色伊人亚洲综合网站色 | 国产91粉嫩白浆在线观看 | 色综合夜色一区 | 久草观看视频 | 欧美精品一区二区三区四区在线 | 国产 色| 精品国产激情 | 欧美日韩国产一区 | 在线观看视频日韩 | 久久国产精品一区二区 | 亚洲天堂网在线观看视频 | 五月天网站在线 | 欧美日韩高清一区 | 一区二区三区在线视频观看58 | 国产午夜一级毛片 | 欧美日韩后 | 在线播放国产一区二区三区 | 精品少妇一区二区三区在线 | 黄色软件网站在线观看 | 欧美疯狂性受xxxxx另类 | 一级性视频 | 波多野结衣视频一区 | 国产精品久久三 | 亚洲一区二区精品3399 | 亚洲乱码久久久 | 黄色一级性片 | 国产成人久久精品一区二区三区 | 麻豆久久久久 | 一级大片在线观看 | 人人干97 | 青青河边草观看完整版高清 | 日日干夜夜爱 | 久久深夜福利免费观看 | 超碰国产在线播放 | 久久高清免费观看 | 美腿丝袜一区二区三区 | 欧美日韩国产一区 | 97超碰人人模人人人爽人人爱 | 特级毛片在线 | a精品视频| 久久午夜精品影院一区 | 久久综合九色九九 | 91精品欧美| www.天天干.com | 欧美综合干 | 久草免费新视频 | 97精品国产97久久久久久久久久久久 | 国产97碰免费视频 | 久av电影| 美女网站黄免费 | 久久免费在线视频 | 久久精品成人热国产成 | 免费人成在线观看网站 | 粉嫩aⅴ一区二区三区 | 成人免费网视频 | 欧美日韩一区二区在线观看 | 亚洲精品小视频在线观看 | 一区二区三区中文字幕在线观看 | 国产99久久久精品 | 人人精品久久 | 天堂视频中文在线 | 国产91精品高清一区二区三区 | 久久精品中文字幕免费mv | 五月亚洲婷婷 | 国产精品一区二区美女视频免费看 | 亚洲高清视频在线观看免费 | 欧美黑吊大战白妞欧美 | 国产免费作爱视频 | 亚洲国产播放 | 在线视频亚洲 | 99这里只有久久精品视频 | 精品一区二区三区四区在线 | 国产中文字幕在线播放 | 久久午夜影院 | 久久久久久久久黄色 | 人人干人人草 | 午夜精品久久久久久久久久久久久久 | 国产成人一区二区在线观看 | 麻豆极品 | 精品免费99久久 | 婷婷色在线观看 | 在线观看成人 | 一区二区三区在线影院 | 黄色com| 久久黄色a级片 | 久久综合狠狠综合久久狠狠色综合 | 日韩欧美xxxx | 亚洲综合网站在线观看 | 狠狠色丁香婷婷综合最新地址 | 日韩在线观看第一页 | 精品久久一二三区 | 视频三区| 国产高清视频 | 久久99国产精品免费网站 | 国产视频在线观看一区 | 亚洲精品成人网 | 色综合久久综合中文综合网 | 黄色视屏免费在线观看 | 久久人人爽人人片 | av电影亚洲| 99视屏| 伊香蕉大综综综合久久啪 | 人人干天天射 | 在线中文字幕网站 | 色婷婷88av视频一二三区 | 久99久在线 | 午夜成人免费影院 | 欧美与欧洲交xxxx免费观看 | 国产在线欧美日韩 | 色婷婷电影 | 日本不卡视频 | 久久国产成人午夜av影院潦草 | 精品亚洲成a人在线观看 | 亚洲精品在线一区二区三区 |